• [模板] manacher


    求回文子串的长度,mp[i]保存以i为中心的回文子串的半径(长度一半)
    利用mx和id,避免重复暴力求解,达到O(n)的时间复杂度
    预先填充一些无关紧要的字符

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    const int MAXN=31000000;
    
    char tmp[MAXN],s[MAXN];
    int mp[MAXN];
    
    int main(){
        int t;
    //  scanf("%d",&t);
        t=1; 
        while(t--){
            scanf("%s",tmp+1);
            memset(mp,0,sizeof(mp));
            memset(s,0,sizeof(s));
            int len=strlen(tmp+1);
            for(int i=1;i<=len;i++){
                s[(i<<1)-1]='#';
                s[(i<<1)]=tmp[i];
            }
            s[(len<<1)+1]='#';
            s[(len<<1)+2]='';
            int id=0,mx=0,ans=-1;
            for(int i=1;s[i]!='';i++){
                int &v=mp[i];
                v=(i<mx)?min(mp[id*2-i],mx-i):1;
                while(i-v>=1&&i+v<=len*2+2&&s[i+v]==s[i-v]) v++;
                if(v+i>mx) mx=v+i,id=i;
                ans=max(ans,v);
            }
            cout<<ans-1<<endl;
        }
    }
    View Code

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247464.html

  • 相关阅读:
    过滤textarea
    vue引用jquery
    vue_ajax插件Axios
    VeeValidate
    mongodb
    WEBGL实现--three.js笔记整理
    My SQLworkbench问题总结
    vue遇到的问题
    MYSQL使用笔记
    vue笔记
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247464.html
Copyright © 2020-2023  润新知