【HDU 3068】【manacher模板題】最長迴文
阿新 • • 發佈:2018-12-24
思路:
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: