蒟蒻就想暴力骗90分,然而90pts->10pts
查看原帖
蒟蒻就想暴力骗90分,然而90pts->10pts
193158
michael_song楼主2020/11/21 12:19

求助

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
string s[210];
int read()
{
	int w=1,f=0;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
			w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		f=f*10+c-'0';
		c=getchar();
	}
	return w*f;
}
struct Tree
{
	int vis[27];
	int fail;
	int end;
}tree[1000000];
int n,cnt;
int ans[1000000];
void build(string s,int num)
{
	int l=s.length();
	int now=0;
	for(int i=0;i<l;i++)
	{
		if(tree[now].vis[s[i]-'a']==0)
			tree[now].vis[s[i]-'a']=++cnt;
		now=tree[now].vis[s[i]-'a'];
	}
	tree[now].end=num;
}
void Get_Fail()
{
	queue<int> Q;
	for(int i=0;i<26;i++)
	{
		if(tree[0].vis[i]!=0)
		{
			tree[tree[0].vis[i]].fail=0;
			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 query(string s)
{
	int l=s.length();
	int now=0;
	for(int i=0;i<l;i++)
	{
		now=tree[now].vis[s[i]-'a'];
		for(int t=now;t;t=tree[t].fail)
			ans[tree[t].end]++;
	}
}
int main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		cin>>s[i];
		build(s[i],i);
	}
	tree[0].fail=0;
	Get_Fail();
	for(int i=1;i<=n;i++)
		query(s[i]);
	for(int i=1;i<=n;i++) 
		printf("%d\n",ans[i]);
	return 0;
}
2020/11/21 12:19
加载中...