• HDU3068 manacher算法


      附上题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068  这个题的意思是给你一个串, 求这个串中的最长的回文串的长度, 直接裸manacher即可。 代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    const int maxn = 110000*2+100;
    char input[maxn];
    char a[maxn]; int p[maxn]; //manacher
    
    void manacher(char *s){
        int len = strlen(s+1);
        int m = 2*len+1;
        for(int i=1; i<=len; i++){
            a[i<<1] = s[i];
            a[i<<1|1] = '#';
        }
        a[0] = '+'; a[1] = '#'; a[m+1] = '-';
       // cout<<a<<endl;
        int mx=0, idx;
        int res = 0;
        for(int i=1; i<=m; i++) {
            if(mx > i)
                p[i] = min(p[2*idx-i], mx-i);
            else
                p[i] = 1;
            for(; a[i-p[i]]==a[i+p[i]]; p[i]++);
            if(p[i]+i > mx) mx = p[i]+i, idx=i;
            res = max(res, p[i]);
        }
        cout<<res-1<<endl;
    //    for(int i=1; i<=m; i++)
    //        cout<<p[i]<<' ';
    //    cout<<endl;
    }
    
    int main() {
        while(scanf("%s", input+1) != EOF){
            manacher(input);
        }
        return 0;
    }
  • 相关阅读:
    android 源码
    android 保护
    电池信息 显示
    RGB、HSB、HSL 互相转换算法
    网页美工
    css 设计标准
    js 封闭 小结
    格式转换工具
    网页设计规范
    瀑布流分析
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5456888.html
Copyright © 2020-2023  润新知