zoukankan      html  css  js  c++  java
  • hdu 3068 最长回文 manacher算法(视频)

    感悟:

    首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳
    感觉这种花费自己时间去教别人的人真的很伟大。
    manacher算法把所有的回文都变成了奇数形式的,所以判断的时候就很方便了,并且p[i]数组存的是:以第i个为中心,他的回文半径是多少。这算法其中还有id和mx,mx是对于一个位置id回文串最长半径是mx。2*id-i是以id为中心关于i对称的那个位置,mx-i是回文串半径长度。
    还有qsc推荐的题
    POJ 1159 Palindrome
    HDU 3068 最长回文
    POJ 3974 Palindrome
    HYSBZ 2342 双倍回文
    HYSBZ 2565 最长双回文串

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 3e5;
    char s[maxn],str[maxn];
    int len1,len2,p[maxn],ans;
    
    void init()
    {
        str[0]='$';
        str[1]='#';
        for (int i=0;i<len1;i++)
        {
            str[i*2+2]=s[i];
            str[i*2+3]='#';
        }
        len2=len1*2+2;
        str[len2]='*';
    }
    void manacher()
    {
        int id=0,mx=0;
        for (int i=1;i<len2;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]];p[i]++);
            if(p[i]+i>mx)
            {
                mx=p[i]+i;
                id=i;
            }
        }
    }
    int main()
    {
        while(scanf("%s",s)!=EOF)
        {
            len1=strlen(s);
            init();
            manacher();
            ans=0;
            for(int i=0;i<len2;i++)
                ans=max(ans,p[i]);
            cout<<ans-1<<endl;
        }
    }
  • 相关阅读:
    个人工作总结02
    个人工作总结01
    第七周学习进度条
    构建之法阅读笔记03
    第六周学习进度条
    团队开发介绍
    最大连通子数组的和
    四则运算-安卓版
    第五周学习进度条
    构建之法阅读笔记02
  • 原文地址:https://www.cnblogs.com/s1124yy/p/5710470.html
Copyright © 2011-2022 走看看