首页 > 其他 > 详细

POJ 3974 Palindrome Manacher

时间:2020-11-24 14:54:04      阅读:21      评论:0      收藏:0      [点我收藏+]
#include<iostream>
#include<string>
using namespace std;

string s;
int cnt = 0;

int min(int a, int b){ return a>b ? b : a; }
int max(int a, int b){ return a>b ? a : b; }

int Manacher()
{
    int len = s.length();
    if(len == 0) return 0;
    len = 2*len+1;
    char *cArr = new char[len];
    int *pArr = new int[len];
    for(int i = 0; i < len; i++)
        cArr[i] = i&1 ? s[(i-1)/2] : ‘#‘;
    
    int R = -1;
    int C = -1;
    int maxn = 0;
    for(int i = 0; i < len; i++)
    {
        pArr[i] = i >= R ? 1 : min(R-i, pArr[2*C-i]);
        while(i+pArr[i] < len && i-pArr[i] > -1)
            if(cArr[i+pArr[i]] == cArr[i-pArr[i]]) pArr[i]++;
            else break;
        if(i+pArr[i] > R)
        {
            R = i + pArr[i];
            C = i;
        }
        maxn = max(maxn, pArr[i]);
    }
    delete[] pArr;
    delete[] cArr;
    return maxn-1;
}

int main()
{
    while(getline(cin, s))
    {
        if(s == "END") break;
        printf("Case %d: %d\n", ++cnt, Manacher());
    }
    //system("pause");
    return 0;
}

POJ 3974 Palindrome Manacher

原文:https://www.cnblogs.com/znk97/p/14030023.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!