uva 1401 - Remember the Word

一个简单的字典树上的dp;

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #define maxn 400000
 5 #define mod 20071027
 6 using namespace std;
 7 priority_queue<int,vector<int>,greater<int> >q;
 8 struct node
 9 {
10     bool f;
11     node *a[26];
12 } no[maxn];
13 int nonocount;
14 int d[maxn];
15 bool vis[maxn];
16 node *newnode()
17 {
18     node *p=no+nonocount++;
19     p->f=0;
20     for(int i=0; i<26; i++)
21         p->a[i]=NULL;
22     return p;
23 }
24 
25 void insert(char *t)
26 {
27     node *root=no;
28     int l=strlen(t);
29     for(int i=0; i<l; i++)
30     {
31         if(root->a[t[i]-'a']==NULL)
32             root->a[t[i]-'a']=newnode();
33         root=root->a[t[i]-'a'];
34     }
35     root->f=1;
36 }
37 char s[maxn],t[105];
38 int len;
39 void query(int w)
40 {
41     node *root=no;
42     for(int i=w; i<len; i++)
43     {
44         if(root->a[s[i]-'a']==NULL)break;
45         root=root->a[s[i]-'a'];
46         if(root->f)
47         {
48             d[i]+=d[w-1];
49             d[i]=d[i]%mod;
50             if(!vis[i+1])
51             {
52                 vis[i+1]=1;
53                 q.push(i+1);
54             }
55         }
56     }
57     while(!q.empty())
58     {
59         int v=q.top();
60         q.pop();
61         query(v);
62     }
63 }
64 
65 
66 int main()
67 {
68     int n,ca=1;
69     while(scanf("%s",s+1)!=EOF)
70     {
71         s[0]='#';
72         memset(d,0,sizeof d);
73         d[0]=1;
74         memset(vis,0,sizeof vis);
75         vis[1]=1;
76         nonocount=0;
77         node *p=newnode();
78         scanf("%d",&n);
79         for(int i=0; i<n; i++)
80         {
81             scanf("%s",t);
82             insert(t);
83         }
84         len=strlen(s);
85         query(1);
86         printf("Case %d: %d\n",ca++,d[len-1]%mod);
87     }
88     return 0;
89 }
View Code

 

posted @ 2013-10-30 12:29  Yours1103  阅读(152)  评论(0编辑  收藏  举报