Codeforces Gym100971 K.Palindromization-回文串 (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)
这个题就是从字符串中删除一个字符,然后剩下的是回文串。
我写的代码虽然长得好看,但是循环里面的比较条件容易想错,太智障了。。。
一开始写的是计数比较,但是有的时候下标相同的也比较了,为了简单一些,直接看有没有条件不成立的,这样就少想好多东西(偷懒为主,嘻嘻嘻)。
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 const int N=1e6+10; 8 char a[N]; 9 int main(){ 10 while(~scanf("%s",a)){ 11 int len=strlen(a); 12 int flag1=0,flag2=0; 13 int num=0,num1=0,num2=0; 14 for(int i=0;i<len/2;i++){ 15 if(a[i]==a[len-1-i])num++; 16 else{ 17 flag1=i;flag2=len-1-i;break; 18 } 19 } 20 //cout<<flag1<<" "<<flag2<<endl; 21 for(int i=flag1+1;i<=len/2;i++){ 22 if(a[i]!=a[len-1-i+1]){ //这个比较容易想错 23 num1++; 24 //cout<<a[i]<<" "<<a[len-1-i+1]<<endl; 25 } 26 } 27 for(int i=flag1;i<len/2;i++){ 28 if(a[i]!=a[len-1-i-1]){ //同上,易错 29 num2++; 30 //cout<<a[i]<<" "<<a[len-1-i-1]<<endl; 31 } 32 } 33 //cout<<num<<" "<<num1<<" "<<num2<<endl; 34 if(num==len/2){ 35 printf("YES\n"); 36 printf("%d\n",len/2+1); 37 } 38 else if(num1==0){ 39 printf("YES\n"); 40 printf("%d\n",flag1+1); 41 } 42 else if(num2==0){ 43 printf("YES\n"); 44 printf("%d\n",flag2+1); 45 } 46 else printf("NO\n"); 47 } 48 return 0; 49 }