84分,WA四个点,真查不出来,求助神犇
查看原帖
84分,WA四个点,真查不出来,求助神犇
198835
阴阳八卦楼主2020/7/24 19:17

rt

#include<bits/stdc++.h>
using namespace std;
string s;
struct node{
	int fail;
	int vis[30];
}tree[200100];
int he[200100],hao[200010];
int to[200010],Next[200010];
int head[200010];
int cnt=0,cntt=0;
void add(int x,int y)
{
	to[cntt]=y;
	Next[cntt]=head[x];
	head[x]=cntt++;
}
void build(string s,int x)
{
	int len=s.size();
	int now=0;
	for(int i=0;i<len;i++)
	{
		if(tree[now].vis[s[i]-'a']==0)tree[now].vis[s[i]-'a']=++cnt;
		now=tree[now].vis[s[i]-'a'];
	}
	hao[x]=now;
}
void zhi()
{
	queue<int>q;
	for(int i=0;i<26;i++)
	{
		if(tree[0].vis[i]!=0)
		{
			tree[tree[0].vis[i]].fail=0;//hui geng
			q.push(tree[0].vis[i]);
		}
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<26;i++)
		{
			if(tree[u].vis[i]!=0)
			{
				tree[tree[u].vis[i]].fail=tree[tree[u].fail].vis[i];
				q.push(tree[u].vis[i]);
			}
			else tree[u].vis[i]=tree[tree[u].fail].vis[i];
		}
	}
}
void dfs(int x)
{
	for(int i=head[x];i!=-1;i=Next[i])
	{
		int v=to[i];
		dfs(v);
		he[x]+=he[v];
	}
}
void init()
{
	cnt=0,cntt=0;
	memset(head,-1,sizeof(head));
	memset(he,0,sizeof(he));
}
int main()
{
	int n;
	scanf("%d",&n);
	init();
	for(int i=1;i<=n;i++){cin>>s;build(s,i);}
	tree[0].fail=0;
	zhi();
	getline(cin,s);
	getline(cin,s);
	int len=s.size();
	int u=0;
	for(int i=0;i<len;i++)
	{
		u=tree[u].vis[s[i]-'a'];
		++he[u];
	}
	for(int i=1;i<=cnt;i++)add(tree[i].fail,i);
	dfs(0);
	for(int i=1;i<=n;i++){printf("%d\n",he[hao[i]]);}
	return 0;
}
2020/7/24 19:17
加载中...