zoukankan      html  css  js  c++  java
  • [hihoCoder#1032]最长回文子串

    Wrong Answer:

     1 /************************************************************************/
     2 /* Manacher算法,求解最长回文字符串!                                   */
     3 /************************************************************************/
     4 #include<iostream>
     5 #include<string.h>
     6 using namespace std;
     7  
     8 inline int min(int a,int b){
     9          return a<b?a:b;
    10 }
    11  
    12 /**初始化string,字符间插入‘*’,返回插入后的字符串**/
    13 char* transform ( char* str)
    14 {
    15     const int len=strlen(str);
    16     char* newStr=new char[2*len+2];
    17     int newlen=0;
    18     //newStr[newlen++]='$';
    19     for(int i=0;i<len;i++)
    20     {
    21         newStr[newlen++]='*';
    22         newStr[newlen++]=str[i];
    23     }
    24     newStr[newlen++]='*';
    25     //newStr[newlen++]='#';
    26     newStr[newlen]='';
    27     return newStr;
    28 } 
    29  //后面与正确版本相同

    Accepted:

     1 /************************************************************************/
     2 /* Manacher算法,求解最长回文字符串!                                   */
     3 /************************************************************************/
     4 #include<iostream>
     5 #include<string.h>
     6 using namespace std;
     7  
     8 inline int min(int a,int b){
     9          return a<b?a:b;
    10 }
    11  
    12 /**初始化string,在首位插入‘$’,字符间插入‘*’,返回插入后的字符串**/
    13 char* transform ( char* str)
    14 {
    15     const int len=strlen(str);
    16     char* newStr=new char[2*len+4];
    17     int newlen=0;
    18     newStr[newlen++]='$';
    19     for(int i=0;i<len;i++)
    20     {
    21         newStr[newlen++]='*';
    22         newStr[newlen++]=str[i];
    23     }
    24     newStr[newlen++]='*';
    25     newStr[newlen++]='#';
    26     newStr[newlen]='';
    27     return newStr;
    28 } 
    29  
    30 /**找到str字符串中最长的回文字符串的长度,返回最长长度值**/
    31 int manacher (char *str)
    32 {  
    33     char* pstr=transform(str);
    34     const int len=strlen(pstr);
    35     int maxR=1;
    36     int* r=new int[len];
    37     memset(r,0,sizeof(r));
    38     int mid=0,lmax=0;
    39 
    40     for(int i=1;i<len;i++)
    41     {
    42         if(i<lmax)
    43             r[i]=min(r[2*mid-i],lmax-i);
    44         else
    45             r[i]=1;
    46 
    47         while(pstr[i-r[i]]==pstr[i+r[i]])
    48             r[i]++;
    49 
    50         if(i+r[i]>lmax)
    51         {
    52             lmax=i+r[i];
    53             mid=i;
    54         }
    55     }
    56 
    57     for(int i=1;i<len;i++)
    58     {
    59         if(r[i]>maxR)
    60         {
    61             maxR=r[i];
    62         }
    63     }
    64 
    65 
    66     delete[] r;
    67     delete[] pstr;
    68     return maxR-1;
    69 }
    70 
    71 
    72 int main ()
    73 {
    74 
    75     int num;
    76     char str[1000000];
    77     cin>>num;
    78     for(int i=0;i<num;i++)
    79     {
    80         cin>>str;
    81         cout<<manacher(str)<<endl;
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    PDF上添加水印
    java调用POI读取Excel
    搭建Linux的VMware Workstation Pro
    js中两种定时器的设置及清除
    SUI使用经验
    List集合与Array数组之间的互相转换
    jquery操作select
    jquery操作CheckBox
    时间格式
    java 获取路径的各种方法
  • 原文地址:https://www.cnblogs.com/lsr-flying/p/4753482.html
Copyright © 2011-2022 走看看