LA 3942 Remember the Word

来源:互联网 发布:数据检索 编辑:程序博客网 时间:2024/05/01 07:05

训练指南 P209 例题

用trie树使得每次寻找递推的下一步。

#include <iostream>#include <cstdio>#include <cstring>#define MOD 20071027using namespace std;struct Trie{    bool tag;    int next[26];    bool init()    {        tag=false;        memset(next,-1,sizeof(next));    }};Trie tree[550000];int lt;void init(){    int i;    lt=1;    tree[0].init();}void insert(char *word){    int t,i,val;    t=0;    i=0;    while (word[i] != '\0')    {        val=word[i]-'a';        if (tree[t].next[val] == -1)        {            tree[t].next[val]=lt;            tree[lt].init();            if (word[i+1] == '\0')                tree[lt].tag=true;            //printf("%d %d %d %d %c\n",t,val,lt,tree[lt].tag,word[i]);            t=lt;            lt++;        }        else        {            t=tree[t].next[val];            if (word[i+1] == '\0')                tree[t].tag=true;        }        i++;    }}char tar[320000];int d[320000];int main(){    char ts[120];    int n,i,k,lts,t,len,j,p;    k=1;    while (scanf("%s",tar) != EOF)    {        lts=strlen(tar);        init();        scanf("%d",&n);        getchar();        for (i=0; i<n; i++)        {            scanf("%s",ts);            insert(ts);        }        memset(d,0,sizeof(d));        for (i=0; i<lts; i++)        {            p=0;            for (j=i; tar[j] != '\0'; j++)            {                t=tar[j]-'a';                if (tree[p].next[t] == -1)                    break;                p=tree[p].next[t];                if (tree[p].tag == true)                {                    if (i-1 != -1)                        d[j]+=d[i-1];                    else                        d[j]++;                    d[j]%=MOD;                }            }           /* len=0;            j=i;            p=0;            while (tar[j] != '\0')            {                t=tar[j]-'a';                len++;               // printf("%c %d %d\n",tar[j],p,tree[p].tag);                if (tree[p].next[t] == -1)                    break;                p=tree[p].next[t];                //printf("%c %d %d\n",tar[j],p,tree[p].tag);                if (tree[p].tag == true)                {                    d[i]+=d[i+len];                    d[i]%=20071027;                }                j++;            }*/        }        printf("Case %d: %d\n",k,d[lts-1]%MOD);        k++;    }}


原创粉丝点击