hihocoder 1032 manachar 求回文串O(n)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <stack>
#include <set>
#include <map>
#include <vector>

using namespace std;
#define INF 0x2fffffff
#define LL long long
#define MAX(a,b) ((a)>(b))?(a):(b)
#define MIN(a,b) ((a)<(b))?(a):(b)
char a[1000005];
char b[2000005];
int  p[2000005];
int newstring(){
    b[0] = ‘$‘;
    b[1] = ‘#‘;
    int len = strlen(a);
    int j = 2;
    for(int i = 0;i < len;i++){
        b[j] = a[i];
        b[++j] = ‘#‘;
        ++j;
    }
    b[j] = ‘\0‘;
}
int manachar(){
    int len = strlen(b);
    int id = 0;
    int maxd = 1;
    int ans = 0;
    for(int i = 1;i < len;i++){
        if(maxd > i){
            p[i] = min(p[2*id-i],maxd-i);
        }else{
            p[i] = 1;
        }
        while(b[p[i]+i] == b[i-p[i]])
            p[i]++;
        if(p[i]+i > maxd){
            maxd = p[i]+i;
            id = i;
        }
        if(ans < p[i]){
            ans = p[i];
        }
    }
    printf("%d\n",ans-1);
}
int main(){
    int t;
    cin >> t;
    while(t--){
        scanf("%s",a);
        newstring();
        manachar();
    }
    return 0;
}

根据回文串左右是完全相同的性质,左边求出来后很快的就能求出来右边的长度

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 09:07:21

hihocoder 1032 manachar 求回文串O(n)的相关文章

马拉车,O(n)求回文串

body { font-family: sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10px; padding-bottom: 10px; background-color: white; padding: 30px } body>*:first-child { margin-top: 0 !important } body>*:last-child { margin-bottom: 0 !important } a

Palindrome - URAL - 1297(求回文串)

题目大意:RT 分析:后缀数组求回文串,不得不说确实比较麻烦,尤其是再用线段数进行查询,需要注意的细节地方比较多,比赛实用性不高......不过练练手还是可以的. 线段数+后缀数组代码如下: =========================================================================================================================================== #include<stdio

HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列,该子序列分为三部分,第一部分与第三部分相同,第一部分与第二部分对称,如果存在求最长的符合这种条件的序列. 思路:用Manacher算法来处理回文串的长度,记录下以每一个-1(Manacher算法的插入)为中心的最大回文串的长度.然后从最大的开始穷举,只要p[i]-1即能得出以数字为中心的最大回文串的长度,然后找到右边对应的'-1',判断p[i]是不是大于所穷举的长度,如果当前的满足三段,那么就跳出,继续

hihocoder 1032 : 最长回文子串(Manacher)

之前做过类似的题,只是理解了,还没达到驾轻就熟,想到即敲出的地步,所以再练一次. 顺带将Manacher算法思想解释一遍,加强印象,也算作分享吧. Manacher 我们用f(x)表示以x位置为中心的回文串的长度 j相对i的对应位置是j' 那么f(j)与f(j')和f(i)有什么关系呢. 先看第一张图,下面那条横杠表示f(i),那么,既然j'与j相对应,j'的回文串长度已经求出,那么j位置的回文串长度一定是大于等于j'长度的. 即f(i) >= f(j')=f(i*2-j) 但是还存在上图这样的

[haoi2009]求回文串

所谓回文串,就是对于给定的字符串,正着读和反着读都一样,比如ABCBA就是一个回文串,ABCAB则不是.我们的目标是对于任意输入的字符串,不断将第i个字符和第i+1个字符交换,使得该串最终变为回文串.求最少交换次数. 题解: 有一种做法是贪心: 就是每次找到最左端的字符,然后找到这序列中最右边的一样的字符,然后把这个字符移过去,然后把最左端右移,继续以上操作: 最后的答案就是每次的移动步数加起来: 要吐槽的是,window下I64d不要忘了...... #include<iostream> #

Codeforces Round #427 (Div. 2) D. Palindromic characteristics(Manacher求回文串)

题目链接:Codeforces Round #427 (Div. 2) D. Palindromic characteristics 题意: 给你一个串,定义k-th回文串,让你求每个k-th的数量. 题解: manacher处理好后做一下dp就行了. 当然也可以直接dp不用manacher. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 5 cons

hihoCoder - 1032 - 最长回文子串 (字符串~)

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一

HDU 1513 Palindrome 求回文串

这个题是走弯路了,刚开始自己DP出了方程,无限MLE,唉 if(s1[i]==s1[j]) dp[i][j]=dp[i+1][j-1]; else dp[i][j]=min(dp[i][j-1],dp[i+1][j]) +1; 后来百度了一下,这个原来是个经典回文串问题,即先将串置反,然后求LCS........ 然后就是这题卡时间卡的特别厉害,多用了一次strlen就TLE AC: #include<cstdio> #include<string> #include<str

hdu 3294 manacher 求回文串

感谢: http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/ O(n)求给定字符串的以每个位置为中心的回文串长度. 中心思想:每次计算位置i的答案时,利用已经算出的1~i-1位置的答案. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define maxn 222222 5 using namespace std; 6 7