uva 1401 - Remember the Word

递推式:d[i]=sum(d[i+len[x]])这道题的数据真狗血,改了一点就过了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 using namespace std;
 5 const int maxnode=4000*100+10;
 6 const int mod=20071027;
 7 const int maxn=300000 + 10;
 8 const int maxw=4000 + 10;
 9 char ss[maxn];
10 char s[110];
11 int d[maxn];
12 int len[maxw];
13 int ch[maxnode][26];
14 int val[maxnode];
15 int sz;
16 void insert(char *s,int v)//v需要为正数
17 {
18     int u=0,len=strlen(s);
19     for(int i=0;i<len;i++)
20     {
21         int c=s[i]-'a';
22         if(!ch[u][c])
23         {
24             memset(ch[sz],0,sizeof(ch[sz]));
25             ch[u][c]=sz++;
26         }
27         u=ch[u][c];
28     }
29     val[u]=v;
30 }
31 void find(char *s,int len,vector<int>& p)
32 {
33     int u=0;
34     for(int i=0;i<len;i++)
35     {
36         if(s[i]=='\0') break;
37         int c=s[i]-'a';
38         if(!ch[u][c])
39         break;
40         u=ch[u][c];
41         if(val[u])
42         p.push_back(val[u]);
43     }
44 }
45 int main()
46 {
47     int CASE=1;
48     while(scanf("%s",ss)!=EOF)
49     {
50         memset(val,0,sizeof(val));
51         memset(ch[0],0,sizeof(ch[0]));
52         memset(d,0,sizeof(d));
53         sz=1;
54         int n;
55         scanf("%d",&n);
56         for(int i=1;i<=n;i++)
57         {
58             scanf("%s",s);
59             len[i]=strlen(s);
60             insert(s,i);
61         }
62         int L=strlen(ss);
63         d[L]=1;
64         for(int i=L-1;i>=0;i--)
65         {
66            vector<int> p;
67            find(ss+i,L-i,p);
68            for(int j=0;j<p.size();j++)
69             d[i]=(d[i]+d[i+len[p[j]]])%mod;
70         }
71         printf("Case %d: %d\n",CASE++,d[0]);
72     }
73     return 0;
74 }

 

posted @ 2013-08-26 19:51  sooflow  阅读(262)  评论(0编辑  收藏  举报