50pts求救
查看原帖
50pts求救
368204
ShanQing楼主2023/2/23 21:54
//writer:Oier_szc

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e4+7;
int n,m,ans=0;
int tr[6005][26],ne[6005],cnt[6005],wrong[6005],idx=0;
int dp[105][6005];
char str[105];
int my_pow(int x)
{
	int res=1;
	for(int i=1;i<=x;++i) res=(res*26)%mod;
	return res;
}
void insert()
{
	int u=0;
	for(int i=0;str[i];++i)
	{
		int to=str[i]-'A';
		if(!tr[u][to]) tr[u][to]=++idx;
		u=tr[u][to];
	}
	++cnt[u];
}
void build_AC()
{
	queue<int> q;
	for(int i=0;i<26;++i)
	{
		if(tr[0][i]) q.push(tr[0][i]);
	}
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		if(cnt[now]) wrong[now]=true;
		for(int i=0;i<26;++i)
		{
			int c=tr[now][i];
			if(!c) tr[now][i]=tr[ne[now]][i];
			else
			{
				ne[c]=tr[ne[now]][i];
				wrong[c]|=wrong[tr[ne[now]][i]];
				q.push(c);
			}
		}
	}
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i)
	{
		scanf("%s",str);
		insert();
	}
	build_AC();
	dp[0][0]=1;
	for(int i=0;i<m;++i)
	{
		for(int j=0;j<=idx;++j)
		{
			for(int k=0;k<26;++k)
			{
				int to=tr[j][k];
				if(!wrong[to]) dp[i+1][to]=(dp[i+1][to]+dp[i][j])%mod;
			}
		}
	}
	ans=my_pow(m);
	for(int i=0;i<=idx;++i)
	{
		ans=((ans-dp[m][i])%mod+mod)%mod;
	}
	printf("%lld",ans);
	return 0;
}
2023/2/23 21:54
加载中...