• A1280. 最长双回文串


    学习了回文树,地址:http://blog.csdn.net/u013368721/article/details/42100363;

    这个题就是正这反着加一遍就好,一开始我想的是枚举每个位置,然后一直按fail跳,再接上跳完的位置的len,后来想了不行,一个很长的全是a的串就可以卡成n^2。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    const int maxn=100010;
    int m,len[maxn],n,nxt[maxn][26],fail[maxn],last,now,ss[maxn],tot,res[maxn],ans;
    char s[maxn];
    int getfail(int x){
        while(ss[m-len[x]-1]!=ss[m])x=fail[x];
        return x;
    }
    int add(char c){
        int x=c-'a';
        ss[++m]=x;
        int cur=getfail(last);
        if(!nxt[cur][x]){
            len[tot]=len[cur]+2;
            fail[tot]=nxt[getfail(fail[cur])][x];
            nxt[cur][x]=tot;
            ++tot;
        }
        last=nxt[cur][x];
        return len[last];
    }
    void init(){
        memset(nxt,0,sizeof(nxt));
        fail[0]=1;len[0]=0;
        len[1]=-1;last=0;tot=2;
        ss[0]=-1;m=0;    
    }
    int main(){
        scanf("%s",s+1);n=strlen(s+1);
        init();for(int i=1;i<=n;++i){res[i]=add(s[i]);}
        init();for(int i=n;i>=2;--i){ans=max(ans,add(s[i])+res[i-1]);}
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    小兔生仔和汽水换瓶的两个算法
    dpi 编程
    作者赠送的《我的第一本c++书》收到啦
    什么是程序员的优良品质
    如何把事情做对?
    学习应有的态度
    魔方数算法
    我的第二本c++教科书
    如何处理人际关系
    电动玩具的开发思路
  • 原文地址:https://www.cnblogs.com/dibaotianxing/p/8451837.html
Copyright © 2020-2023  润新知