思路:递推+trie。
注意:1、不能用string,不然会超时。
2、strlen不能算很多次,不然会超时。
3、如果写了构造函数,并且在一个函数中调用,会挂。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <cstring>
#include <map>
using namespace std;
#define maxn 4000
#define maxnode maxn*100+5
#define maxlen 300000
#define ll long long
#define MOD 20071027
struct Trie {
int ch[maxnode][30];
int in[maxnode];
int sz;
void clear(){
sz=0;
memset(ch[sz],0,sizeof(ch[sz]));
memset(in,0,sizeof(in));
}
void insert(char* x,int j) {
int u=0;
int len=strlen(x);
for(int i=0; i<len; i++) {
int y=x[i]-'a';
if(!ch[u][y]) {
ch[u][y]=++sz;
memset(ch[sz],0,sizeof(ch[sz]));
}
u=ch[u][y];
}
in[u]=j;
}
void find(char* x,int Len,vector<int>& vec) {
int u=0;
for(int i=0; i<Len; i++) {
int y=x[i]-'a';
if(!ch[u][y]) return ;
u=ch[u][y];
if(in[u]) vec.push_back(in[u]);
}
}
};
char s[maxlen+5];
int n;
char a[maxn+5][200];
ll f[maxlen+5];
Trie trie;
int main() {
int T=0;
while(~scanf("%s",s)) {
memset(f,0,sizeof(f));
trie.clear();
scanf("%d",&n);
char x[200];
for(int i=1; i<=n; i++) {
scanf("%s",x);
memcpy(a[i],x,sizeof(a[i]));
trie.insert(x,i);
}
int Size=strlen(s);
f[Size]=1;
for(int i=Size-1;i>=0;i--){
vector<int> vec;
trie.find(s+i,Size-i,vec);
for(int j=0;j<vec.size();j++){
int len=strlen(a[vec[j]]);
f[i]=(f[i]+f[i+len])%MOD;
}
}
printf("Case %d: %d\n",++T,f[0]);
}
return 0;
}