最長迴文 HDU
阿新 • • 發佈:2018-12-10
manacher水題
# include <string.h> # include <stdio.h> # include <algorithm> const int maxn=110005; int a[maxn<<1]; char str[maxn<<1]; int main(){ using namespace std; while(~scanf("%s", str)){ int len=strlen(str), id=0, maxlen=0; for(int i=len; i>=0; i--){ str[i*2+1]='#'; str[i*2+2]=str[i]; } str[0]='*'; //algorithm main selection for(int i=2; i<2*len+1; i++){ if(a[id]+id>i) a[i]=min(a[2*id-i], a[id]+id-i); else a[i]=1; while(str[i-a[i]] == str[i+a[i]]) a[i]++; if(id+a[id]<i+a[i]) id=i; if(maxlen<a[i])maxlen=a[i]; } printf("%d\n",maxlen-1); } return 0; }
總結:罪惡的g++超時,c++ac,manacher就是在字元之間插入一個未出現過的字元,例如#,插入個數len+1,保證無論是奇數長度還是偶數長度都可以解決字串迴文問題,str[0]網上說要插入一個不同的字元,反思不懂。