P5496(每个位置的后缀回文串的个数 PAM模板)

题目
在这里插入图片描述
一个字符串得所有本质不同得回文串的个数是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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值