求助,WA90%
查看原帖
求助,WA90%
118822
skin楼主2018/12/5 12:54

码丑勿喷

#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int s[2100000],n,u,len,tot,a[21000],b[21000];
char s1[2100][210];
queue<int> q;
struct node
{
	int a[30],last,fail,s;
}ch[1100000];
void BFS()
{
	for(int i=0;i<=25;i++)
	if(ch[0].a[i])
	q.push(ch[0].a[i]);
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=0;i<=25;i++)
		{
			int y=ch[x].a[i];
			if(y)
			{
				int p=ch[ch[x].fail].a[i];
				ch[y].fail=p;
				q.push(y);
			}
			else
			ch[x].a[i]=ch[ch[x].fail].a[i];
		}
	}
}
int main()
{
	scanf("%d",&n);
	memset(ch,0,sizeof(ch));
	tot=len=0;
	for(int i=1;i<=n;i++)
	{
		int l;
		scanf("%s",s1[i]+1);
		l=strlen(s1[i]+1);
		u=0;
		for(int j=1;j<=l;j++)
		{
			s[j+len]=s1[i][j];
			int x=s1[i][j]-'a';
			if(!ch[u].a[x])
			{
				tot++;
				ch[u].a[x]=tot;
			}
			u=ch[u].a[x];
		}
		ch[u].s++;
		a[i]=u;
		len+=l;
		len++;
		s[len]='#';
	}
	BFS();
	u=0;
	for(int i=1;i<=len;i++)
	{
		u=ch[u].a[s[i]-'a'];
		int x=u;
		while(x)
		{
			b[x]+=ch[x].s;
			x=ch[x].fail;
		}
	}
	for(int i=1;i<=n;i++)
	printf("%d\n",b[a[i]]);
	return 0; 
}
2018/12/5 12:54
加载中...