社区讨论

求助,WA50pts

P4052[JSOI2007] 文本生成器参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mlkk0rq0
此快照首次捕获于
2026/02/13 15:16
6 天前
此快照最后确认于
2026/02/16 14:40
3 天前
查看原帖
CPP
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
const int mod = 10007;
struct ACAM
{
	int sons[26], fail;
	bool flag;
}
acam[6005];
long long n, m, sz, nowi, p[65], dp[2][6005], ans;
string s;
vector <int> g[6005];
queue <int> q;
bool flag, vis[6005];
long long qpow(long long a, long long p)
{
	long long ret = 1;
	while (p)
	{
		if (p & 1)
		{
			ret *= a;
			ret %= mod;
		}
		a *= a;
		a %= mod;
		p >>= 1;
	}
	return ret;
}
int main()
{
	cin >> n >> m;
	for (int i = 1;i <= n;i++)
	{
		cin >> s;
		flag = nowi = 0;
		for (int j = 0;j < s.size();j++)
		{
			if (!acam[nowi].sons[s[j] - 'A'])
			{
				acam[nowi].sons[s[j] - 'A'] = ++sz;
			}
			nowi = acam[nowi].sons[s[j] - 'A'];
			if (g[nowi].size())
			{
				flag = 1;
				break;
			}
		}
		if (flag)
		{
			continue;
		}
		acam[nowi].flag = 1;
		for (int i = 1;i <= 26;i++)
		{
			g[nowi].emplace_back(nowi);
		}
		p[i] = nowi;
	}
	q.push(0);
	while (q.size())
	{
		nowi = q.front();
		q.pop();
		if (vis[nowi])
		{
			continue;
		}
		vis[nowi] = 1;
		for (int i = 0;i < 26;i++)
		{
			if (nowi && acam[nowi].sons[i])
			{
				acam[acam[nowi].sons[i]].fail = acam[acam[nowi].fail].sons[i];
			}
			else
			{
				acam[nowi].sons[i] = acam[acam[nowi].fail].sons[i];
			}
			if (!acam[nowi].flag)
			{
				g[nowi].emplace_back(acam[nowi].sons[i]);
			}
			q.push(acam[nowi].sons[i]);
		}
	}
	dp[0][0] = 1;
	for (int i = 1;i <= m;i++)
	{
		for (int j = 0;j <= sz;j++)
		{
			dp[i & 1][j] = 0;
		}
		for (int j = 0;j <= sz;j++)
		{
			for (int k = 0;k < g[j].size();k++)
			{
				dp[i & 1][g[j][k]] += dp[(i & 1) ^ 1][j];
				dp[i & 1][g[j][k]] %= mod;
			}
		}
	}
	ans = qpow(26, m);
	for (int i = 0;i <= sz;i++)
	{
		if (!acam[i].flag)
		{
			ans += mod - dp[m & 1][i];
			ans %= mod;
		}
	}
	cout << ans;
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...