自动机模版
#include<bits/stdc++.h> using namespace std; class Automaton { public: static const int maxn=100005,ALP=26; int last,next[maxn*2][ALP],p,fail[maxn*2],len[maxn*2]; long long sum; virtual void init(); virtual int newnode(int l); virtual void add(int c); }; class SuffixAutomaton:Automaton { void init() { sum=last=p=0,fail[0]=-1; newnode(0); } int newnode(int l) { for(int i=0;i<ALP;i++)next[p][i]=-1; len[p]=l; return p++; } void add(int c) { int cur=newnode(len[last]+1),t=last; for(;t!=-1&&next[t][c]==-1;t=fail[t])next[t][c]=cur; if(t==-1)fail[cur]=0; else { int q=next[t][c]; if(len[t]+1==len[q])fail[cur]=q; else { int clone=newnode(len[t]+1); fail[clone]=fail[q]; for(int i=0;i<26;i++)next[clone][i]=next[q][i]; for(;t!=-1&&next[t][c]==q;t=fail[t])next[t][c]=clone; fail[q]=fail[cur]=clone; } } last=cur; sum+=len[cur]-len[fail[cur]]; } }sam; class PalindromeAutomaton:Automaton { int s[maxn],n; int cnt[maxn];//表示节点i表示的本质不同的串的个数(建树时求出的不是完全的,最后count()函数跑一遍以后才是正确的) int num[maxn];//表示以节点i表示的最长回文串的最右端点为回文串结尾的回文串个数 //num[last]为最后添加的一个字母所增加的回文子串个数。 int newnode(int l) { for(int i=0;i<ALP;i++)next[p][i]=0; cnt[p]=num[p]=0,len[p]=l; return p++; } void init() { sum=p=last=n=0,s[n]=-1,fail[0]=1; newnode(0),newnode(-1); } int get_fail(int x) { while(s[n-len[x]-1]!=s[n])x=fail[x]; return x; } void add(int c) { s[++n]=c; int cur=get_fail(last); if(!next[cur][c]) { int now=newnode(len[cur]+2); fail[now]=next[get_fail(fail[cur])][c]; next[cur][c]=now,num[now]=num[fail[now]] + 1; } last=next[cur][c]; cnt[last]++; } void count() { for(int i=p-1;i>=0;i--)cnt[fail[i]]+=cnt[i]; } }pam; int main() { return 0; }