Calf Flac

  枚举每一个回文的中间位置,当循环到原文的第i个位置时有两种情况 ,

一种是奇数长度的回文,中间位置为i。

另一种是偶数长度的回文 ,中位置为i 和i+1。

利用回文数的特点(pal[i]=pal[n-1-i])去判断即可。

回文数在ACM题中出现还挺多的,一定要牢牢地抓住这条性质。

#include<algorithm> #include<cstdio> #include<string.h> #include<iostream> #include<cmath> using namespace std; #define ischar(i) ( str[i]>='A' && str[i]<='Z' || str[i]>='a' && str[i]<='z' ) char str[20020]; int cnt,s,e,ans; void handle(int ts,int te,bool flag){ int tmp; tmp=flag?1:0; while(ts>-1 && te<cnt ) { while( ts>-1 && !ischar(ts) )ts--; while( te<cnt && !ischar(te) )te++; if( ts>-1 && te<cnt && ( str[ts]==str[te] ||abs( str[ts]-str[te] )==32 ) ) { tmp+=2; if(ans<tmp){ s=ts,e=te; ans=tmp; } ts--;te++; continue; } else break; } } int main(){ freopen("calfflac.in","r",stdin); freopen("calfflac.out","w",stdout); cin.getline(str,sizeof(str),EOF);//文件结束!@#$@# cnt=strlen(str); int i=0; while( !ischar(i) )i++; s=e=i; ans=1; for(i++;i<cnt;i++) { if( ischar(i) ) { handle(i-1,i+1,true); handle(i,i+1,false); } } str[e+1]='/0'; printf("%d/n%s/n",ans,str+s); return 0; }

你可能感兴趣的:(Calf Flac)