1. 程式人生 > >【HDU 3068】【manacher模板題】最長迴文

【HDU 3068】【manacher模板題】最長迴文

思路:

manacher模板題複雜度O(n), 這題二分+hash或者字尾陣列複雜度為O(nlogn),好像會T

程式碼:

#include <bits/stdc++.h>
using  namespace  std;
const int N=110005;

char str[N];//原始字串
char s[N<<1];//經過Manacher處理後的字串
int p[N<<1];//儲存迴文串半徑,減1迴文長度
int ans;

void manacher(char str[], int len){//原字串及其長度
    int l=0;
    s[l++]='$';
    s[l++]='#';
    for(int i=0; i<len; i++){
        s[l++]=str[i];
        s[l++]='#';
    }
    s[l]=0;
    int mx=0, id=0;
    for(int i=0; i<l; i++){
        p[i]=(mx>i ? min(p[2*id-i], mx-i) : 1);
        while(s[i+p[i]] == s[i-p[i]])p[i]++;
        if(i+p[i]>mx) mx=i+p[i], id=i;
        ans=max(ans, p[i]-1);
    }
}


int  main(){
    while(~scanf("%s", str)){
        int n=strlen(str); ans=0;
        memset(p, 0, sizeof(p));
        manacher(str, n);
        printf("%d\n", ans);
    }
    return 0;
}

最長迴文

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


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
Recommend lcy   |   We have carefully selected several similar problems for you:  
1358
 1686 3336 3065 3746