学过oi10年,不是妹子,10分求助
查看原帖
学过oi10年,不是妹子,10分求助
251449
hfjh楼主2023/2/7 08:18
#include<bits/stdc++.h>
using namespace std;
const int N=70,M=110,MOD=1e4+7;
int n,m,len,now,son[N*M][30],tot=0,pos=0,ans=0;
char s[110];
int q[N*M],head=1,tail=0,bj[N],dp[N][N],fail[N];
int mpow(int x,int k){
	int ans=1,now=x;
	while(k){
		if(k%2) ans*=now;
		ans%=MOD;
		k>>=1;
		now=(now*now)%MOD;
	}
	return ans%MOD;
}
void input(){
	scanf("%d%d",&n,&m);
//	for(int i=0;i<26;i++) son[0][i]=++tot;
	for(int i=1;i<=n;i++){
		scanf("%s",s);
		len=strlen(s);
		now=0;
		for(int j=0;j<len;j++){
			if(son[now][s[j]-'A']==0)son[now][s[j]-'A']=++tot;
			now=son[now][s[j]-'A'];
		}
		bj[now] = 1;
	}
}
void pre(){
	for(int i=0;i<26;i++) if(son[0][i])q[++tail]=son[0][i],fail[son[0][i]]=0; 
	while(head<=tail){
		int x=q[head++];
		for(int i=0;i<26;i++){
			if(son[x][i]){
				pos=fail[x];
				while(son[pos][i]&&pos) pos=fail[pos];
				fail[son[x][i]]=son[pos][i];
				bj[son[x][i]]=bj[fail[son[x][i]]];
				q[++tail]=son[x][i];
			}else son[x][i]=son[fail[x]][i];
		}
	}
} 
int main(){
	input();
	pre();
	dp[0][0]=1;
	for(int i=0;i<m;i++){
		for(int j=0;j<=tot;j++){
			for(int k=0;k<26;k++){
				if(!bj[j]){
					dp[i+1][son[j][k]]=(dp[i+1][son[j][k]]+dp[i][j])%MOD;
				}
			}
		}
	}
	ans=mpow(26,m);
	for(int i=0;i<=tot;i++){
		if(!bj[i]) ans=ans-dp[m][i]+MOD;
		ans%=MOD;
	}
	printf("%d ",(ans+MOD)%MOD);
	return 0;
}
2023/2/7 08:18
加载中...