Source
Preliminary (Single)先按单词建树。。。dp【i】代表i到n的方案数则 dp【i】=∑ (dp【j】) (i到j是个完整的单词)#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define INF 0x3f3f3f3f
#define mem(x,y) memset(x,y,sizeof(x))
typedef long long LL;
#define MX 500000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int rear=0;
struct node {
int End;
int to[26];
} tree[MX];
int root;
int tree_new() {
rear++;
tree[rear].End=0;
for(int i=0; i<26; i++) tree[rear].to[i]=0;
return rear;
}
void tree_init() {
rear=0;
root=tree_new();
}
void tree_add(char *s) {
int rt=root,len=strlen(s);
for(int i=0; i
if(tree[rt].to[s[i]-'a']==0)
tree[rt].to[s[i]-'a']=tree_new();
rt=tree[rt].to[s[i]-'a'];
}
tree[rt].End=1;
}
void tree_query(char *s,vector&arr) {//arr中储存的是一个完整单词的末尾下标
int rt=root,len=strlen(s);
for(int i=0; i
rt=tree[rt].to[s[i]-'a'];
if(rt==0) return ;
if(tree[rt].End) arr.push_back(i);
}
}
char s[500000];
int dp[500000];
const int mod=835672545;
void solve() {
int len=strlen(s);
dp[len]=1;
vector arr;
for(int i=len-1; i>=0; i--) {
tree_query(s+i,arr);//返回arr
for(int j=0; j
dp[i]=(dp[i]+dp[i+arr[j]+1])%mod;//DP
}
while(!arr.empty()) arr.pop_back();//清空arr
}
}
int main() {
// freopen("input.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--) {
tree_init();
int n;
mem(dp,0);
scanf("%d",&n);
for(int i=0; i
scanf("%s",s);
tree_add(s);
}
scanf("%s",s);
solve();
printf("%d\n",dp[0]);
}
return 0;
}