题目链接:http://codeforces.com/gym/100971/problem/K
Mihahim has a string s. He wants to delete exactly one character from it so that the resulting string would be a palindrome. Determine if he can do it, and if he can, what character should be deleted.
The input contains a string s of length (2 ≤ |s| ≤ 200000), consisting of lowercase Latin letters.
If the solution exists, output «YES» (without quotes) in the first line. Then in the second line output a single integer x — the number of the character that should be removed from s so that the resulting string would be a palindrome. The characters in the string are numbered from 1. If there are several possible solutions, output any of them.
If the solution doesn't exist, output «NO» (without quotes).
evertree
YES
2
emerald
NO
aa
YES
2
题意:给你一个字符串,删除一个字符,是否形成回文,如果有,输出删除的位置;
思路:对于删除一个字符以后,这个字符串的对称轴的位置只有两个,所有枚举对称轴,复杂度O(n);
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<vector> using namespace std; #define LL long long const int N=2e5+100,M=1e6+10,inf=1e9+10; const LL INF=1e18+10,mod=19260817; char a[N]; int checkl(int l,int r,int n,int L) { while(r<=n) { while(a[l]!=a[r]) { if(L!=1)return 0; L=l; l--; } l--;r++; } return L; } int checkr(int l,int r,int n,int R) { while(l>=1) { while(a[l]!=a[r]) { if(R!=n)return 0; else R=r; r++; } l--;r++; } return R; } int main() { scanf("%s",a+1); int n=strlen(a+1); if(n%2==0) { int ans=checkl(n/2,n/2+2,n,1); if(ans)return 0*printf("YES\n%d\n",ans); ans=checkr(n/2-1,n/2+1,n,n); if(ans)return 0*printf("YES\n%d\n",ans); puts("NO"); } else { int ans=checkl(n/2+1,n/2+2,n,1); if(ans)return 0*printf("YES\n%d\n",ans); ans=checkr(n/2,n/2+1,n,n); if(ans)return 0*printf("YES\n%d\n",ans); puts("NO\n"); } return 0; }