• 前缀 树 背单词(Remember the Word,LA 3942)


    已哭瞎。 搞了2个多小时的错误居然是在  没有初始化。。。。。。。。。。。。教训:每个例子一定要考虑到初始化问题。!

    每个节点存了一个数组  该数组记录的有26个大小  0-25分别表示记录表示'a'-'z'。一个节点数组的单位记录的是下一个节点的索引即第几个节点。 节点数组记录了

    他的所有子节点在哪里和以及子节点的字符是什么。本节点没有记录自己的字符。

    适用于 多个字符串。减少枚举量

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    #define maxnode 500000
    #define sigma_dize 27
    #define Mod 20071027
    int cnt;
    char str[300005],word[105];
    int num[300005];
    struct Trie
    {
        int ch[maxnode][sigma_dize];
        int val[maxnode];
        int size;
        void Init()
        {
            size=1;memset(ch[0],0,sizeof(ch[0]));
        }
    
        int idx(char c)
        {
            return c-'a';
        }
    
        void insert(char *s,int v)
        {
            int u=0;
            int len=strlen(s);
            for(int i=0;i<len;i++)
            {
                int c=idx(s[i]);
                if(!ch[u][c])
                {
                    memset(ch[size],0,sizeof(ch[size]));
                    val[size]=0;
                    ch[u][c]=size++;
                }
                u=ch[u][c];
            }
            val[u]=v;
        }
        void  search(char * s,int start)
        {
            int u=0;num[start]=0;
            int len=strlen(s);
            for(int i=start;i<len;i++)
            {
                int c=idx(s[i]);
                if(ch[u][c]==0) return;
                u=ch[u][c];
                if(val[u]) num[start]=(num[i+1]+num[start])%Mod;
                
            }
        }
    };
    
    Trie curTire;
    int main(void)
    {
        int s,h=1;
        while(scanf("%s",str)!=EOF)
        {
            curTire.Init();
            cin>>s;
            while(s--)
            {
                scanf("%s",word);
                curTire.insert(word,1);
            }
            
            int len=strlen(str);
            memset(num,0,sizeof(num));
            num[len]=1;
            cnt=0;
            for(int i=len-1;i>=0;i--)
                curTire.search(str,i);
            printf("Case %d: %d
    ",h++, num[0]);
        }
        return 0;
    }
  • 相关阅读:
    Javascript之让图片固定在一个位置
    Android之AIDL实现Demo
    android listview 上下边缘的模糊去掉
    Android中Application设置全局变量以及传值
    Android之在Bitmap上涂鸦效果
    Android之TabHost重定义
    Android数据库升级实例,已更新
    Android之更新ListView,位置置顶的问题
    Android之Parcelable使用
    Asp.Net 2.0 防盗下载文件·············
  • 原文地址:https://www.cnblogs.com/woshijishu3/p/4161907.html
Copyright © 2020-2023  润新知