题目
一个字符串得所有本质不同得回文串的个数是A.tot-2; HDU3948
一个字符串得所有回文串的个数是 HihoCoder-1589
ll ans=0;
for(int i=2;i<=A.tot-1;++i) ans+=A.cnt[i];
每插入一个字符,所得到不同的回文子串的个数是:A.tot-2;
judge_id: 275869DQ ural1960. Palindromes and Super Abilities
for(int i=1;i<=len;++i) A.add(s[i]),printf("%d%c",A.tot-2,(i!=len)?' ':'\n');
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e6+5,Max=26;
int lastans;
struct PAM{
int nex[N][26],fail[N],s[N],len[N],num[N],cnt[N],las,tot,n;
int newnode(int le){
for(int i=0;i<Max;++i) nex[tot][i]=0;
cnt[tot]=num[tot]=0,len[tot]=le;
return tot++;
}
void init(){
tot=0,newnode(0),newnode(-1);
n=las=0,s[n]=-1,fail[0]=1;
}
int get_fail(int x){
while(s[n-len[x]-1]!=s[n]) x=fail[x];
return x;
}
void add(int c){
c-='a',s[++n]=c;
int cur=get_fail(las);
if(!nex[cur][c]){
int now=newnode(len[cur]+2);
fail[now]=nex[get_fail(fail[cur])][c];
nex[cur][c]=now,num[now]=num[fail[now]]+1;//等于now这个子串+不加入这个字符时以i为下标为结尾的回文子串的个数 即num[now]=num[fail[now]]+1;
}//假设添加的为第i个字符,以i这个下标为结尾的的回文子串的个数(后缀回文串)
las=nex[cur][c],++cnt[las];//正好(emm)是这样运算 并没有实际关系...我说num数组.
printf("%d ",lastans=num[las]);
}
void _count(){
for(int i=tot-1;i>=0;--i) cnt[fail[i]]+=cnt[i];
}//cnt[i]:这个节点所代表的回文串的数量.
}A;
char s[N];
int main(){
scanf("%s",s+1);int len=strlen(s+1);
A.init();
for(int i=1;i<=len;++i) A.add((s[i]-97+lastans)%26+97);
}