題意:給定一個字符串(只考慮其中的'a'~'z'或'A'~'Z'),找出其中最長的迴文,輸出迴文長度和原始的最短的包含該回文的字符串片段。
數據的輸入比較噁心,爲此WA了好多次。題意要求測試文件裏可能有多行數據,每行不超過80個字符,總共不超過20000個字符。找回文的時候,要把多行數據看成一行,找最長的,但輸出的時候原來有換行的地方在迴文裏還是要換行,需要注意。
代碼如下:
/*
ID: michael139
LANG: C
PROG: calfflac
*/
#include<stdio.h>
#include<string.h>
char af[20005],be[20005];
int locate[20005],is_newline[20005];
int main () {
FILE *fin = fopen("calfflac.in", "r");
FILE *fout = fopen("calfflac.out", "w");
char c;
int len = 0,i,mid,max,left,right;
memset(is_newline,0,sizeof(is_newline));
while (fscanf(fin,"%c",&be[len++]) != EOF) {
if (be[len-1]=='\n') {
is_newline[len-1] = 1;
len--;
}
}
be[len] = '\0';
len = i = 0;
memset(locate,-1,sizeof(locate));
while (be[i]!='\0') {
if (be[i]>='A' && be[i]<='Z' || be[i]>='a' && be[i]<='z') {
locate[len] = i;//Record the char location.
if (be[i]>='a' && be[i]<='z') {
af[len++] = be[i]-32;
} else af[len++] = be[i];
}
i++;
}
af[len] = '\0';
max = -1;
for (mid=0;mid<len;mid++) {
for (i=0;i<=mid;i++) {
if (mid+i>=len || af[mid-i]!=af[mid+i]) {
break;
}
}
if (max<i*2-1) {
max = i*2-1;
left = mid-i;
right = mid+i;
}
for (i=0;i<=mid;i++) {
if (mid+i+1>=len || af[mid-i]!=af[mid+i+1]) {
break;
}
}
if (max<i*2) {
max = i*2;
left = mid-i;
right = mid+i+1;
}
}
fprintf(fout,"%d\n",max);
for (i=locate[left+1];i<=locate[right-1];i++) {
if (is_newline[i]) fprintf(fout,"\n");
fprintf(fout,"%c",be[i]);
}
fprintf(fout,"\n");
return 0;
}