最长回文子串(Manacher算法)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:59   2743   0
题目描述:

回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
回文子串,顾名思义,即字符串中满足回文性质的子串。
给出一个只由小写英文字符a,b,c...x,y,z组成的字符串,请输出其中最长的回文子串的长度。

输入:

输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于200000。

输出:

对于每组测试用例,输出一个整数,表示该组测试用例的字符串中所包含的的最长回文子串的长度。

样例输入:
abab
bbbb
abba
样例输出:
3
4
4
#include <stdio.h>

char s[200002];
char str[400010];
int p[400010];

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

int pre(){
 int i,j = 0;
 str[j++] = '$';
 for(i = 0;s[i];i++){
  str[j++] = '#';
  str[j++] = s[i];
 }
 str[j++] = '#';
 str[j] = '\0';
 return j;
}

void manacher(int n){
 int mx = 0,id,i;
 p[0] = 0;
 for(i = 1;i < n;i++){
  if(mx > i)
   p[i] = min(mx - i,p[2 * id - i]);
  else
   p[i] = 1;
  while(str[i - p[i]] == str[i + p[i]])
   p[i]++;
  if(p[i] + i > mx){
   mx = p[i] + i;
   id = i;
  }
 }
}


int main(int argc, char const *argv[]){

 while(scanf("%s",s) != EOF){
  int n = pre();
  manacher(n);
  int ans = 0,i;
  for(i = 1;i < n;i++)
   if(p[i] > ans)
    ans = p[i];
  printf("%d\n",ans - 1);  
 }
 return 0;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP