zoukankan      html  css  js  c++  java
  • BZOJ 2342: [Shoi2011]双倍回文

    Description

    Input

    输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容。

    Output

    输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0

    Sample Input

    16
    ggabaabaabaaball

    Sample Output

    12

    HINT

    N<=500000


    显然这一题比较水如果会回文自动机的话
    然后就成为回文自动机模版题了
    先建出回文自动机
    然后建出fail树对长度为偶数的fail树dfs
    如果一个节点的长度%4==0并且这个节点长度的一半是这个节点的fail
    然后就输出就好了
    Manacher的话就不会了果然还是太弱了。。。
    code:
    #define MAXN 505005
    #define maxn 26
     
    #include <stdio.h>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    int n,e=1,first[MAXN],vis[MAXN],Ans;
    char s[MAXN];
     
     
    struct edge{
        int u,v,next;
    }a[MAXN<<1];
     
    inline void push(int u,int v){
        a[e].u=u;
        a[e].v=v;
        a[e].next=first[u];
        first[u]=e++;
    }
     
    int len[MAXN],ch[MAXN][maxn],num[MAXN],fail[MAXN],tot,last;
     
    inline int get_fail(int x,int l){
        while(s[l-len[x]-1]!=s[l])x=fail[x];
        return x;
    }
     
    int newnode(int x){
        len[tot]=x;
        return tot++;
    }
     
    void build(char *s){
        newnode(0);newnode(-1);
        fail[0]=1;s[0]=-1;
        for(int i=1;s[i];i++){
            s[i]-='a';
            int rt=get_fail(last,i);
            if(!ch[rt][s[i]]){
                int now = newnode(len[rt]+2);
                fail[now]=ch[get_fail(fail[rt],i)][s[i]];
                push(fail[now],now);
                ch[rt][s[i]]=now;
            }
            num[last=ch[rt][s[i]]]++;
        }
    }
     
    void dfs(int u){
        if(len[u]%4==0&&vis[len[u]/2])Ans=max(Ans,len[u]);
        vis[len[u]]++;
        for(int i=first[u];i;i=a[i].next){
            int v=a[i].v;
            dfs(v);
        }
        vis[len[u]]--;
    }
     
    int main(){
        scanf("%d%s",&n,s+1);
        build(s);
        dfs(0);
        printf("%d",Ans);
    }



  • 相关阅读:
    快速幂,矩阵乘法,矩阵快速幂
    关于xor
    数位dp
    tarjan,割边,桥,割点
    RMQ,ST表,dp
    逆序对,树状数组,归并排序
    线段树
    dp,LCS
    清北 游
    青蛙的约会(扩展欧几里得)
  • 原文地址:https://www.cnblogs.com/Cooook/p/7738536.html
Copyright © 2011-2022 走看看