社区讨论

关于struct

P3966[TJOI2013] 单词参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mm8ri8e8
此快照首次捕获于
2026/03/02 13:52
上周
此快照最后确认于
2026/03/05 13:30
5 天前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node
{
	int nxt[26],fail;
}tp[N];
int n,cnt,g[N],ans[N],last[N],a[N],ano[N];
string s[205];
queue<int>q;
void add(string s,int num)
{
	int u=0;
	for(int i=0;i<s.size();i++)
	{
		int x=s[i]-'a';
		if(!tp[u].nxt[x]) tp[u].nxt[x]=++cnt;
		u=tp[u].nxt[x];
	}
	g[num]=u;
	return ;
}
void fail()
{
	for(int i=0;i<26;i++)
	{
		int k=tp[0].nxt[i];
		if(k!=0)
		{
			tp[k].fail=0;
			q.push(k);
		}
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		int f=tp[u].fail;
		for(int i=0;i<26;i++)
		{
			int k=tp[u].nxt[i];
			if(k!=0)
			{
				tp[k].fail=tp[f].nxt[i];
				q.push(k);
				a[tp[k].fail]++;
				continue;
			}
			tp[u].nxt[i]=tp[f].nxt[i];
		}
	}
	return ;
}
void query(string ss)
{
	int u=0;
	for(int i=0;i<ss.size();i++)
	{
		int x=ss[i]-'a';
		u=tp[u].nxt[x];
		ans[u]++;
	}
	return ;
}
void bfs()
{
	for(int i=1;i<=cnt;i++)
		if(!a[i]) q.push(i);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		a[tp[u].fail]--;
		ans[tp[u].fail]+=ans[u];
		if(!a[tp[u].fail]) q.push(tp[u].fail);
	}
	return ;
}
signed main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>s[i];
		add(s[i],i);
	}
	fail();
	for(int i=1;i<=cnt;i++) ano[i]=a[i];
	for(int i=1;i<=n;i++)
	{
        memset(ans,0,sizeof ans);
        memcpy(a,ano,sizeof ano);
		query(s[i]);
		bfs();
		for(int i=1;i<=n;i++) last[i]+=ans[g[i]];
	}
	for(int i=1;i<=n;i++) printf("%d\n",last[i]);
	return 0;
}
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node
{
	int nxt[26];
}tp[N];
int n,cnt,g[N],ans[N],last[N],a[N],ano[N],fail[N];
string s[205];
queue<int>q;
void add(string s,int num)
{
	int u=0;
	for(int i=0;i<s.size();i++)
	{
		int x=s[i]-'a';
		if(!tp[u].nxt[x]) tp[u].nxt[x]=++cnt;
		u=tp[u].nxt[x];
	}
	g[num]=u;
	return ;
}
void fff()
{
	for(int i=0;i<26;i++)
	{
		int k=tp[0].nxt[i];
		if(k!=0)
		{
			fail[k]=0;
			q.push(k);
		}
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		int f=fail[u];
		for(int i=0;i<26;i++)
		{
			int k=tp[u].nxt[i];
			if(k!=0)
			{
				fail[k]=tp[f].nxt[i];
				q.push(k);
				a[fail[k]]++;
				continue;
			}
			tp[u].nxt[i]=tp[f].nxt[i];
		}
	}
	return ;
}
void query(string ss)
{
	int u=0;
	for(int i=0;i<ss.size();i++)
	{
		int x=ss[i]-'a';
		u=tp[u].nxt[x];
		ans[u]++;
	}
	return ;
}
void bfs()
{
	for(int i=1;i<=cnt;i++)
		if(!a[i]) q.push(i);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		a[fail[u]]--;
		ans[fail[u]]+=ans[u];
		if(!a[fail[u]]) q.push(fail[u]);
	}
	return ;
}
signed main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>s[i];
		add(s[i],i);
	}
	fff();
	for(int i=1;i<=cnt;i++) ano[i]=a[i];
	for(int i=1;i<=n;i++)
	{
        memset(ans,0,sizeof ans);
        memcpy(a,ano,sizeof ano);
		query(s[i]);
		bfs();
		for(int i=1;i<=n;i++) last[i]+=ans[g[i]];
	}
	for(int i=1;i<=n;i++) printf("%d\n",last[i]);
	return 0;
}
为什么一个TLE一个A?

回复

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

正在加载回复...