MLE求助
查看原帖
MLE求助
491741
王昊岩123楼主2024/4/14 19:01

其他oj可过,谷上MLE

#include<bits/stdc++.h>
#define N 105
#define M 6005
#define mod 10007
using namespace std;
int n,m;
char s[N];
namespace AC
{
	int tr[M][26];
	int fail[N];
	int dp[N][M];
	bool vis[M];
	int tot = 1;
	void insert(char x[],int id)
	{
		int u = 1,l = strlen(x + 1);
		for(int i = 1;i <= l;i++)
		{
			if(!tr[u][x[i] - 'A']) tr[u][x[i] - 'A'] = ++tot;
			u = tr[u][x[i] - 'A'];
		}
		vis[u] |= 1;
	}
	queue<int> q;
	void build()
	{
		for(int i = 0;i < 26;i++) tr[0][i] = 1;
		q.push(1);
		fail[1] = 0;
		while(!q.empty())
		{
			int u = q.front();
			q.pop();
			for(int i = 0;i < 26;i++)
			{
				int v = tr[u][i];
				if(!v) 
				{
					tr[u][i] = tr[fail[u]][i];
					vis[u] |= vis[fail[u]];
				}
				else 
				{
					vis[v] |= vis[fail[u]];
					fail[v] = tr[fail[u]][i],q.push(v);
				}
			}
		}
	}
	void solve()
	{
		int ans1 = 1;
		for(int i = 1;i <= m;i++) ans1 = (ans1 * 26) % mod;
		memset(dp,0,sizeof(dp));
		dp[0][1] = 1;
		for(int i = 0;i < m;i++)
		{
			for(int j = 1;j <= tot;j++)
			{
				for(int s = 0;s < 26;s++)
				{
					int k = tr[j][s];
					if(vis[k]) continue;
					dp[i + 1][k] = (dp[i + 1][k] + dp[i][j]) % mod;
					//printf("dp[%d][%d]:%d\n",i + 1,k,dp[i + 1][k]);
				}
			}
		}
		int ans = 0;
		for(int i = 1;i <= tot;i++) ans = (ans + dp[m][i]) % mod;
		int y = (ans1 - ans) % mod;
		printf("%d",(y % mod + mod) % mod);
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++) scanf("%s",s + 1),AC::insert(s,i);
	AC::build();
	AC::solve();
	return 0;
}
2024/4/14 19:01
加载中...