蒟蒻10分求助!WA
查看原帖
蒟蒻10分求助!WA
541542
FHenryh楼主2023/2/1 10:02
#include<bits/stdc++.h>
#define N 10005
#define M 10005
#define MOD 10007
using namespace std;
int n,m;
int tr[N][27],tot;
int fail[N];
bool word[N];
char s[M];
int dp[105][N];
int ans,cnt=1;
void insert(char s[])
{
	int p=0,len=strlen(s);
	for(int i=0;i<len;i++)
	{
		int &to=tr[p][s[i]-'A'];
		if(!to)to=++tot;
		p=to;
	}
	word[p]|=1;
}
void getfail()
{
	queue<int>q;
	for(int i=0;i<26;i++)
		if(tr[0][i])q.push(tr[0][i]);
	while(!q.empty())
	{
		int p=q.front();
		q.pop();
		for(int i=0;i<26;i++)
		{
			if(tr[p][i])
			{
				word[tr[p][i]]|=word[tr[fail[p]][i]];
				fail[tr[p][i]]=tr[fail[p]][i];
				q.push(tr[p][i]);
			}
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		insert(s);
	}
	getfail();
	dp[0][0]=1;
	for(int i=1;i<=m;i++)
		for(int j=0;j<=tot;j++)
			for(int k=0;k<26;k++)
				if(!word[tr[j][k]])
				{
					dp[i][tr[j][k]]+=dp[i-1][j];
					dp[i][tr[j][k]]%=MOD;
				}
	for(int i=0;i<=tot;i++)
	{
		ans+=dp[m][i];
		ans%=MOD;
	}
	for(int i=1;i<=m;i++)
	{
		cnt*=26;
		cnt%=MOD;
	}
	cout<<(cnt-ans+MOD)%MOD;
	return 0;
}

2023/2/1 10:02
加载中...