這個題目現在是用manacher線性演算法寫的,尾碼數組版本的還沒實現,打算過兩天搞定
還是覺得這個算髮搞定迴文問題既好寫又快
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;#define MIN(a,b) (a<b?a:b)char str[2500];char rec[2500];int drome[2500];int main(){ int i,j,k; int max_pos,pos; while(scanf("%s",rec)!=EOF) { k=0; str[k++]='@'; for(i=0;rec[i];i++) { str[k++]='#'; str[k++]=rec[i]; } str[k++]='#'; str[k]=0; drome[0]=1; max_pos=0; pos=0; for(i=1;str[i];i++) { if(max_pos > i) { drome[i]=MIN(drome[pos*2-i],max_pos-i); } else drome[i]=1; for( ;str[i+drome[i]]==str[i-drome[i]];drome[i]++) ; if(i+drome[i] > max_pos) pos=i,max_pos=drome[i]+i; } max_pos=-1; pos=0; for(j=0;j<i;j++) { if(drome[j] > max_pos) { max_pos=drome[j]; pos=j; } } // printf("MAX:%d\n",max_pos); max_pos; k=pos-max_pos+1; pos+=max_pos-1; for(k;k<pos;k++) if(str[k]!='#') printf("%c",str[k]); printf("\n"); } return 0;}