奇怪的问题
查看原帖
奇怪的问题
109220
Farkas_W楼主2021/3/16 18:50
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#define re register int
#define il inline
using namespace std;
il int read()
{
  int x=0,f=1;char ch=getchar();
  while(!isdigit(ch)&&ch!='-')ch=getchar();
  if(ch=='-')f=-1,ch=getchar();
  while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  return x*f;
}
const int N=2e6+5,M=2e5+5;
int n,ch[M][26],cnt=1,fail[N],nxt[M],head[M],tot,go[M],sz[M],pos[M];
char s[N];
il void insert(int id)
{
	scanf("%s",s+1);
	int u=1,len=strlen(s+1);
	for(re i=1;i<=len;i++)
	{
		int x=s[i]-'a';
		if(!ch[u][x])ch[u][x]=++cnt;
		u=ch[u][x];
	}
	pos[id]=u;
}
il void get_fail()
{
	queue<int>q;
	//for(re i=0;i<26;i++)if(ch[1][i])fail[ch[1][i]]=1,q.push(ch[1][i]);//用这个92分
	q.push(1);for(re i=0;i<26;i++)ch[0][i]=1;//这个100分
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(re i=0;i<26;i++)
		if(ch[u][i])fail[ch[u][i]]=ch[fail[u]][i],q.push(ch[u][i]);
		else ch[u][i]=ch[fail[u]][i];
	}
}
il void change()
{
	scanf("%s",s+1);
	int u=1,len=strlen(s+1);
	for(re i=1;i<=len;i++)
	u=ch[u][s[i]-'a'],sz[u]++;
}
il void Add(int x,int y)
{
	nxt[++tot]=head[x];
	head[x]=tot;go[tot]=y;
}
il void dfs(int x)
{
	for(re i=head[x],y;i,y=go[i];i=nxt[i])
	dfs(y),sz[x]+=sz[y];
}
signed main()
{
	n=read();
	for(re i=1;i<=n;i++)insert(i);
	get_fail();change();
	for(re i=2;i<=cnt;i++)Add(fail[i],i);
	dfs(1);
	for(re i=1;i<=n;i++)printf("%d\n",sz[pos[i]]);
	return 0;
}

代码中有个注释的地方,用上面的92分,用下面的100分,有谁知道上面的写法有什么问题吗

2021/3/16 18:50
加载中...