社区讨论

求助(关于N)

P3796AC 自动机(简单版 II)参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@miekpxcv
此快照首次捕获于
2025/11/25 20:50
3 个月前
此快照最后确认于
2025/11/25 21:43
3 个月前
查看原帖
rt,理论上只有2e+4的规模,但为什么maxN=1e+5时会RE为,maxN要开到1e+6就能AC
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 条回复,欢迎继续交流。

正在加载回复...