• hdu----(3068)最长回文(manacher)


    最长回文

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 8253    Accepted Submission(s): 2825


    Problem Description
    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
    回文就是正反读都是一样的字符串,如aba, abba等
     
    Input
    输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
    两组case之间由空行隔开(该空行不用处理)
    字符串长度len <= 110000
     
    Output
    每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
     
    Sample Input
    aaaa abab
     
    Sample Output
    4 3
     
    Source
     求最长回文子串.....manacher算法
     
    代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #define maxn 110020
     5 char str[maxn*2];
     6 int rad[maxn*2];
     7 int Min(int a ,int b){
     8   return a<b?a:b;
     9 }
    10 void init(char s[],int len){
    11     int i,j=1;
    12   for(i=(len<<1)+1,s[i+1]='';i>0;i--){
    13         if(i&1)  s[i]='#';
    14         else {
    15        s[i]=s[len-j];
    16        j++;
    17         }
    18   }
    19   s[i]='$';
    20 }
    21 int manacher(int len){
    22   memset(rad,0,sizeof(int)*(len+1));
    23   int id,mx=0,i,ans=0;
    24   for(i=1;i<len;i++){
    25       if(mx>i) rad[i]=Min(rad[id*2-i],mx-i);
    26     else rad[i]=1;
    27     while(str[i+rad[i]]==str[i-rad[i]])rad[i]++;
    28     if(i+rad[i]>mx){
    29          mx=i+rad[i];
    30          id=i;
    31     }
    32     if(ans<rad[i])ans=rad[i];
    33   }
    34   return ans-1;
    35 }
    36 int main(){
    37    int len;
    38   while(scanf("%s",str)!=EOF){
    39    len=strlen(str);
    40    init(str,len);
    41    printf("%d
    ",manacher(len*2+1));
    42  }
    43  return 0;
    44 }
    View Code
  • 相关阅读:
    Leetcode: Rotate Image
    Leetcode: Longest Palindromic Substring && Summary: Palindrome
    Leetcode: Reverse Nodes in k-Group
    Leetcode: Substring with Concatenation of All Words
    Leetcode: Merge k Sorted List
    Summary: Java中函数参数的传递
    Leetcode: Generate Parentheses
    超级wifi
    路由器中继(repeater)模式 和 AP+WDS模式区别?
    route 的标志位
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3961664.html
Copyright © 2020-2023  润新知