• hdu5371Hotaru's problem manacher算法


    //给一个序列。让求其最大子序列
    //这个序列由三段组成。第一段和第二段对称,第一段和第三段一样
    //manacher算法求得p[i]
    //枚举第二段的起点和长度,得到结果
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std ;
    const int maxn = 2e5 + 10 ;
    int str[maxn] ;
    int p[maxn] ;
    void pk(int n)
    {
        int i;
        int mx = 0;
        int id=0;
        for(i=0; i<n; i++)
        {
            if( mx > i )
                p[i] = min( p[2*id-i], mx-i );
            else
                p[i] = 1;
            for(; str[i+p[i]] == str[i-p[i]] && i - p[i] >= 0 && i + p[i] < n; p[i]++);
            if( p[i] + i > mx )
            {
                mx = p[i] + i;
                id = i;
            }
        }
    }
    int main()
    {
        int t  ;
        int cas = 0 ;
        int  n ;
        scanf("%d" , &t) ;
        while(t--)
        {
            scanf("%d" , &n) ;
            for(int i = 0;i <= 2*n+1;i++)
            p[i] = 0 ;
            int len = 0 ;
            str[len++] = -1 ;
            for(int i = 1;i <= n;i++)
            {
                scanf("%d" , &str[len++]) ;
                str[len++] = -1 ;
            }
            int ans = 1 ;
            pk(len) ;
            for(int i = 2;i < len-1 ;i += 2)
              for(int j = ans;j <= p[i] ;j += 2)
                if(p[i + j -1]>= j)
                  ans = j;
            ans = ans/2*3 ;
            printf("Case #%d: ",++cas) ;
            cout<<ans<<endl;
        }
        return 0 ;
    }
    
    
    
    
  • 相关阅读:
    JAVA---File递归遍历文件目录,输出绝对路径
    JAVA--Map集合
    (笔记)JAVA--集合实现斗地主洗牌、发牌、看牌(利用TreeSet排序)
    SVN简单使用
    System.Object
    动态创建控件
    select 查询
    数据类型
    入门(值得注意的地方)
    错误调式 异常处理
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7142581.html
Copyright © 2020-2023  润新知