码迷,mamicode.com
首页 > 其他好文 > 详细

字符串题目

时间:2019-09-13 17:40:34      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:img   图片   can   style   void   c++   name   int   for   

 本质不同回文串个数   tot-1;

技术图片
#include<bits/stdc++.h>
#define ll long long
#define LL long long
using namespace std;
const int maxn=2e5+10;
const int num=26;
char ss[maxn];
int fail[maxn],cnt[maxn],len[maxn],ch[maxn][num];
struct PAM{
    int last,tot;
    ll ans;
    void inint(){
        last=0;  tot=0;
        fail[0]=fail[1]=1;
        len[0]=0; len[1]=-1; tot++;
    }
    int get_fail(int p,int pos){
         while(ss[pos-len[p]-1]!=ss[pos]) p=fail[p];
         return p;
    }
    void add(int x,int pos){
        int p=get_fail(last,pos);
        if(!ch[p][x]){
            len[++tot]=len[p]+2;
            fail[tot]=ch[get_fail(fail[p],pos)][x];
            ch[p][x]=tot;
        }
        cnt[last=ch[p][x]]++;
    }
    void count(){  //  bu zhi bu tong hui wen ge shu
        for(int i=tot;i>=0;i--){
            cnt[fail[i]]+=cnt[i];
            cnt[fail[i]]%=51123987;
        }
    }
    ll count_tot(){
        ll w=0; count();
        for(int i=2;i<=tot;i++) w+=cnt[i];
        return w;
    }
    void clear(){
        for(int i=0;i<=tot;i++){
            fail[i]=0; len[i]=0; cnt[i]=0;
            for(int j=0;j<num;j++) ch[i][j]=0;
        }
        last=tot=ans=0;
    }
}pam;
int main(){
    //int x; scanf("%d",&x);
    scanf("%s",ss);
    int l=strlen(ss); pam.inint();
    for(int i=0;i<l;i++) {
        pam.add(ss[i]-a,i);
        if(i!=0) printf(" ");
        printf("%d",pam.tot-1);
    }
}
View Code

 

字符串题目

标签:img   图片   can   style   void   c++   name   int   for   

原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/11517152.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!