模板—字符串—回文自动机

模板—字符串—回文自动机

Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 500010
int nxt[N][26],tot=1,fa[N]={1,1},last,n;
long long size[N],len[N]={0,-1}; char str[N];
void insert(int x,int now)
{
	int p=last;
	while(str[now-len[p]-1]!=str[now]) p=fa[p];
	if(!nxt[p][x])
	{
		int q=fa[p]; while(str[now-len[q]-1]!=str[now]) q=fa[q];
		fa[++tot]=nxt[q][x],nxt[p][x]=tot,len[tot]=len[p]+2;
	} last=nxt[p][x],size[last]++;
}
int main()
{
	scanf("%s",str+1),n=strlen(str+1);
	for(int i=1;i<=n;i++) insert(str[i]-'a',i);
	for(int i=tot;i>1;i--) size[fa[i]]+=size[i];
}

  

posted @ 2019-04-04 18:39  Yang1208  阅读(288)  评论(0编辑  收藏  举报