社区讨论
求助,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 条回复,欢迎继续交流。
正在加载回复...