UVA1401 Remember the Word
阿新 • • 發佈:2021-10-14
就DP本身來說非常好想,但是怎樣知道這個東西有沒有在字典裡出現過呢
hash似乎還是有點慢
這時候就應該用字典樹了
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int f[300005]; int tr[400005][50]; string s; int cnt; int n; int mod=20071027; char oor[3000005]; int p; int num[3000005]; void add(int l){ int x=0; for(int i=0;i<l;++i){ int v=s[i]-'a'; if(!tr[x][v]){ tr[x][v]=++p; } x=tr[x][v]; } num[x]++; } void que(int x,int l){ int no=0; for(int i=x;i<=l;++i){ int v=oor[i]-'a'; if(!tr[no][v]) return ; if(num[tr[no][v]]) f[x]+=f[i+1],f[x]%=mod; no=tr[no][v]; } } int main(){ while(scanf("%s",oor+1)!=EOF){ cnt++; int l=strlen(oor+1); scanf("%d",&n); memset(num,0,sizeof(num)); memset(tr,0,sizeof(tr)); p=0; for(int i=1;i<=n;++i){ cin>>s; add(s.length()); } memset(f,0,sizeof(f)); f[l+1]=1; for(int i=l;i>=1;--i){ que(i,l); } printf("Case %d: %d\n",cnt,f[1]); } return 0; }