问题是问本质不同的回文串的个数,回文树的模版题
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define maxx 100005
#define N 26
using namespace std;
typedef long long ll;
struct PAM
{
int nex[maxx][N];
int fail[maxx];
int cnt[maxx];
int num[maxx];
int len[maxx];
int S[maxx];
int last;
int n;
int p;
int ans;
inline int newNode(int l)
{
for(int i=0;i<26;i++)nex[p][i]=0;
cnt[p]=0;
num[p]=0;
len[p]=l;
return p++;
}
void init()
{
ans=0;
p=0;
newNode(0);newNode(-1);
last=0;n=0;
S[n]=-1;
fail[0]=1;
}
inline int getFail(int x)
{
while(S[n-len[x]-1]!=S[n])x=fail[x];
return x;
}
inline void insert(int c)
{
c-='a';
S[++n]=c;
int cur=getFail(last);
if(!nex[cur][c])
{
int now=newNode(len[cur]+2);
fail[now]=nex[getFail(fail[cur])][c];
nex[cur][c]=now;
num[now]=num[fail[now]]+1;
ans++;
}
last=nex[cur][c];
cnt[last]++;
}
void count()
{
for(int i=p;i>=0;i--)cnt[fail[i]]+=cnt[i];
}
}pam;
char c[maxx];
int main()
{
int t;cin>>t;
int cal=1;
while(t--) {
scanf("%s", c);
pam.init();
for (int i = 0; c[i]; i++) {
pam.insert(c[i]);
}
printf("Case #%d: %d\n",cal++,pam.ans);
}
return 0;
}```
2302

被折叠的 条评论
为什么被折叠?



