• 回文串


    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int m1=299993;
    const int m2=1e9+7;
    const int K=13331;
    const int N=600000+10;
    char b[N];
    char a[N];
    int p[N];
    struct point{
        int num,ha;//mod 1e9+7
        int len;
    }poi[N];
    int n,ans;
    ///////////////////////////////
    int nxt[N],pre[N];
    int tot;
    ll h1[N],h2[N];
    ll jin1[N],jin2[N];
    ll H(int st,int ed,int ce){
        ll ret;
        if(ce==1){
            ret=(h1[ed]+m1-h1[st-1]*jin1[ed-st+1])%m1;
        }
        else{
            ret=(h2[ed]+m2-h2[st-1]*jin2[ed-st+1])%m2;
        }
        return ret;
    }
    void insert(ll xi1,ll xi2){
            
    }
    bool check(){
            
    }
    void work(int st,int ed){
        ll ha1=H(st,ed,1);
        ll ha2=H(st,ed,2);
        if(!check(ha1)){
            insert(ha1,ha2);
            if(st!=ed){
            
            }//add edges
        }
        else{
            
        }//++num
    }
    //////////////////////////hash
    void manacher(){
        int id=1,mx=0;
        p[1]=1;
        for(int i=2;i<=n;i++){
            p[i]=min(mx-i,2*id-i);
            if(p[i]<0) p[i]=0;
            int j=i-p[i],k=i+p[i];
            while(j>0&&k<n&&a[k]==a[j]){
                p[i]++;
                if(i+p[i]-1>mx){
                    id=i;
                    mx=i+p[i]-1;
                    work(i-p[i]+1,i+p[i]-1);
                }
                j--,k++;
            }
        }
    }
    ///////////////////////////manacher
    struct node{
        int nxt,to;
    }bian[2*N];
    int hd[N],cnt;
    int du[N];
    void add(int x,int y){
        bian[++cnt].nxt=hd[x];
        bian[cnt].to=y;
        hd[x]=cnt;
        du[y]++;
    }
    int q[N];
    int 
    void topo(){
    }
    //////////////////////////topu
    int main()
    {
        scanf("%s",b+1);
        int m=strlen(b+1);
        for(int i=1;i<=m;i++) a[++n]='#',a[++n]=b[i];
        a[++n]='#';
        jin1[0]=1;jin2[0]=1;
        for(int i=1;i<=n;i++) jin1[i]=(jin1[i-1]*K)%m1,jin2[i]=(jin2[i-1]*K)%m2;
        for(int i=1;i<=n;i++) h1[i]=(h1[i-1]*K+a[i])%m1,h2[i]=(h2[i-1]*K+a[i])%m2;
        
        manacher();
    }
  • 相关阅读:
    面试题:JS中map的陷阱
    C#中正则表达式进行忽略大小写的字符串替换
    C#窗体钉在桌面、置底、嵌入桌面的办法
    创建C#串口通信程序详解
    为类和函数代码自动添加版权注释信息
    C# 如何编辑文件的摘要信息
    C# GDI在控件上绘图
    泛型Dictionary的用法详解
    Winform 导出成Excel打印代码
    C#反射深入学习
  • 原文地址:https://www.cnblogs.com/Miracevin/p/9175296.html
Copyright © 2020-2023  润新知