WHY WA
查看原帖
WHY WA
173660
zhoukangyang楼主2020/4/1 19:53
#include<bits/stdc++.h>
#define mod 10007
using namespace std;
int n,len,lens,sp[20009][26],dp[101][20009],fail[20009],u=0,v=1,use[20009],tot,now,ans,uuu=1;
bool ts[20009];
char a[20009];
int head[20009],last[20009];
struct node {
	int val,next;
} f[20009];
void dfs(int x,bool flag) {
	bool sflag=(flag|ts[now]);
	ts[now]=sflag;
	for(int i = head[x]; i != 0; i = f[i].next) dfs(i,sflag);
}
int main() {
	scanf("%d%d",&n,&lens);
	for(int i = 1; i <= n; i++) {
		scanf("%s",&a);
		len=strlen(a);
		now=0;
		for(int j = 0; j < len; j++) {
			if(sp[now][a[j]-'A']==0) ++tot,sp[now][a[j]-'A']=tot;
			now=sp[now][a[j]-'A'];
		}
		ts[now]=true;
	}
	while(u<v) {
		++u;
		for(int i = 0; i < 26; i++) {
			if(sp[use[u]][i]==0) sp[use[u]][i]=sp[fail[use[u]]][i];
			else fail[sp[use[u]][i]]=(use[u]==0?0:sp[fail[use[u]]][i]),++v,use[v]=sp[use[u]][i];
		}
	}
	for(int i = 1; i <= tot; i++) {
		if(head[fail[i]]==0) head[fail[i]]=i;
		else f[last[fail[i]]].next=i;  
		last[fail[i]]=i;
	} 
	dfs(0,false);
	dp[0][0]=1;
	for(int i = 1; i <= lens; i++)
		for(int j = 0; j <= tot; j++)
			for(int k = 0; k < 26; k++){
				if(ts[sp[j][k]]==true) continue;
				dp[i][sp[j][k]]=(dp[i][sp[j][k]]+dp[i-1][j])%mod;
			}
	for(int i = 0; i <= tot; i++) ans=(ans+dp[lens][i])%mod;
	for(int i = 1; i <= lens; i++) uuu=uuu*26%mod;
	printf("%d",(uuu-ans+mod)%mod) ;
	return 0;
}
2020/4/1 19:53
加载中...