社区讨论
求助(关于N)
P3796AC 自动机(简单版 II)参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miekpxcv
- 此快照首次捕获于
- 2025/11/25 20:50 3 个月前
- 此快照最后确认于
- 2025/11/25 21:43 3 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define maxN 1000000
#define maxS 26
int nxt[maxN][maxS];
int fail[maxN];
int tag[maxN];
int n;
int cnt = 0;
void insert(string s,int num)
{
int len = s.length();
int now = 0;
for(int i = 0; i < len; i++)
{
int p = s[i] - 'a';
if(nxt[now][p])
now = nxt[now][p];
else
now = nxt[now][p] = ++cnt;
}
tag[now] = num;
return;
}
void buildac()
{
queue<int> q;
for(int i = 0; i < maxS; i++)
if(nxt[0][i])
q.push(nxt[0][i]);
while(!q.empty())
{
int now = q.front();
q.pop();
for(int i = 0; i < maxS; i++)
{
if(nxt[now][i])
{
fail[nxt[now][i]] = nxt[fail[now]][i];
q.push(nxt[now][i]);
}
else
nxt[now][i] = nxt[fail[now]][i];
}
}
return;
}
long long ans[maxN];
void query(string s)
{
int now = 0;
int len = s.length();
for(int i = 0; i < len; i++)
{
now = nxt[now][s[i] - 'a'];
int k = now;
while(k)
{
ans[tag[k]]++;
k = fail[k];
}
}
return;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
n = -1;
while(n != 0)
{
cin >> n;
if(n == 0)
break;
memset(nxt,0,sizeof(nxt));
memset(fail,0,sizeof(fail));
memset(tag,0,sizeof(tag));
memset(ans,0,sizeof(ans));
string s1[200];
string s2;
for(int i = 1; i <= n; i++)
{
cin >> s1[i];
insert(s1[i],i);
}
cin >> s2;
long long minc = 0;
buildac();
query(s2);
for(int i = 1; i <= n; i++)
minc = max(minc,ans[i]);
cout << minc << '\n';
for(int i = 1; i <= n; i++)
if(ans[i] == minc)
cout << s1[i] << '\n';
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...