`
从此醉
  • 浏览: 1047173 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

hdu 3068 最长回文

 
阅读更多

点击打开链接hdu 3068


思路:manacher求解字符串最长回文串

分析:详见点击打开链接

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define MAXN 240010

int ans;
char tmpStr[MAXN];
char String[MAXN];
int rad[MAXN];

/*求rad数组*/
void manacher(){
    
    ans = 0;
    int mx = 0;
    int id;
    int len = strlen(String);

    for(int i = 1 ; i < len ; i++){
        if(mx > i)
          rad[i] = min(rad[2*id-i] , mx-i);
        else
          rad[i] = 1;
        for(; String[i+rad[i]] == String[i-rad[i]] ; rad[i]++);
        if(rad[i]+i > mx){
          mx = rad[i]+i;
          id = i;
        } 
        ans = max(ans , rad[i]);   
    }
}

int main(){
    while(scanf("%s" , tmpStr) != EOF){
       /*求String*/
       int pos = 0;
       int len = strlen(tmpStr);
       String[pos++] = '$';
       for(int i = 0 ; i <= len ; i++){/*这里是枚举到len的长度*/
          String[pos++] = '#';
          String[pos++] = tmpStr[i];
       }
       manacher();
       printf("%d\n" , ans-1);
    }
    return 0;
}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics