题目分析:
1.直接枚举回文串的起始位置和重点位置会超时,O(n^3),会超时,最长的回文串为2000;
2. 直接枚举中间位置,O(n^2),
3.先对字符文本进行预处理,对非字母符号全部去掉,s1[20100],开一个p[20100]记录s1[i]在原字符串中的位置,
方便输出原字符串.
4.注意它的输入,是以文本的形式输入,可能有好几行,
5.FILE *fin=fopen("calfflac.in","r");
FILE *fout=fopen("calfflac.out","w");
int k=0;
while(!feof(fin))
{
s[k++]=fgetc(fin);
}
fprintf(fout,"%d\n",ans);
for(int i=p[start];i<=p[end];i++)
fprintf(fout,"%c",s[i]);
fprintf(fout,"\n");
的用法
/* ID:wconvey PROG:calfflac LANG:C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<ctype.h> #include<algorithm> using namespace std; char s[20100],s1[20100]; int p[20100]; int main() { //freopen("calfflac.in","r",stdin); //freopen("calfflac.out","w",stdout); FILE *fin=fopen("calfflac.in","r"); FILE *fout=fopen("calfflac.out","w"); int k=0; while(!feof(fin)) { s[k++]=fgetc(fin); } s[k]='\0'; //gets(s); { int len=strlen(s); int c=0; for(int i=0;i<len;i++) { if(isalpha(s[i])) { p[c]=i; s1[c++]=toupper(s[i]); } } c--; //printf("%d****\n",c); //puts(s); //puts(s1); /*for(int i=0;i<=c;i++) printf("p[%d]=%d %c ",i,p[i],s[p[i]]); printf("*****\n");*/ int ans=0,start=0,end=0; for(int i=1;i<=c-1;i++) { int temp=0,j; if(s1[i]==s1[i+1]) { temp+=2; for(j=1;j<=i;j++) { if(i+j<=c && s1[i-j]==s1[i+1+j]) temp+=2; else break; } if(temp>ans) { ans=temp; start=i-(j-1); end=i+(j-1)+1; //printf("temp=%d start=%d end=%d\n",temp,start,end); } } else { temp+=1; for(j=1;j<=i;j++) { if(i+j<=c&&s1[i-j]==s1[i+j] )//写错了,s1[i-j]==s1[i-j] temp+=2; else break; } if(temp>ans) { ans=temp; start=i-(j-1); end=i+(j-1); //printf("temp=%d start=%d end=%d\n",temp,start,end); } } }//******for /*printf("%d\n",ans); for(int i=p[start];i<=p[end];i++) printf("%c",s[i]); printf("\n");*/ fprintf(fout,"%d\n",ans); for(int i=p[start];i<=p[end];i++) fprintf(fout,"%c",s[i]); fprintf(fout,"\n"); } //system("pasue"); return 0; }