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 }