• hihoCoder week1 最长回文子串


    题目链接

    https://hihocoder.com/contest/hiho1/problem/1

    做法 Manacher

    #include <bits/stdc++.h>
    using namespace std;
    
    #define Max(a,b) ((a>b)?a:b)
    const int N = 1e6 + 10;
    char s[N], c[N*2];
    
    int dp[N*2]; // 以i为中心的 回文半径
    
    void init(int len) 
    {
        c[0]='$';
        for(int i=1;i<=len;i++){
            c[i*2-1]='#';
            c[i*2]=s[i];
        }
        c[2*len+1]='#';    
        c[2*len+2]='';
    }
    
    int manacher(int len)
    {
        memset(dp, 0, sizeof(dp));
        int l = 2 * len + 1;
        int pos=0,R=0,mx=0;
        // printf(" ");
        for(int i=1; i<=l; i++) {
            if(i < R)
                dp[i]=min(dp[2*pos-i], R-i);
            else 
                dp[i]=1;
            while( 1<=i-dp[i] && i+dp[i]<=l && c[i-dp[i]] == c[i+dp[i]] )
                dp[i]++;
            if(i+dp[i] > R) {
                R = i + dp[i];
                pos = i;
            }
            mx = Max(mx, dp[i]-1);
            // printf("%d",dp[i]);
        } 
        //ans = mx;
        return mx;
    }
    int main()
    {
        freopen("in.txt","r",stdin);
        int T; scanf("%d", &T);
        while(T--) {
            scanf(" %s", s+1);
            int len = strlen(s+1);
            init(len);
            // cout << c <<endl;
            cout << manacher(len) <<endl;
        }
        return 0;
    }
  • 相关阅读:
    iscsi-分区类型
    NFS
    测试目录
    测试
    函数
    循环、枚举、条件判断、选择排序
    格式化、列表、元组、字典、集合
    常量、注释、变量、堆栈、数据类型、强制转换
    站点迁移至https://traceless.site/
    CENTOS7 源码安装NGINX
  • 原文地址:https://www.cnblogs.com/Draymonder/p/9915225.html
Copyright © 2020-2023  润新知