题意:输入T组字符串,每个字符串都必须改变一次,每个字母改变的规则是变成相邻的字母,字母a只能变b,z只能变y,判断改变后的字符依旧是否能够变成回文串
n<=1e2
思路:
1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<cmath> 5 #include<iostream> 6 #include<algorithm> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<vector> 11 using namespace std; 12 typedef long long ll; 13 typedef unsigned int uint; 14 typedef unsigned long long ull; 15 typedef pair<int,int> PII; 16 typedef vector<int> VI; 17 #define fi first 18 #define se second 19 #define MP make_pair 20 #define N 410000 21 #define MOD 1000000007 22 #define eps 1e-8 23 #define pi acos(-1) 24 #define oo 110000000000000 25 26 char c[N][2],a[N]; 27 int b[N]; 28 29 int read() 30 { 31 int v=0,f=1; 32 char c=getchar(); 33 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 34 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 35 return v*f; 36 } 37 38 39 void swap(int &x,int &y) 40 { 41 int t=x;x=y;y=t; 42 } 43 44 45 46 int main() 47 { 48 //freopen("1.in","r",stdin); 49 //freopen("1.out","w",stdout); 50 int cas; 51 scanf("%d",&cas); 52 while(cas--) 53 { 54 int n; 55 scanf("%d",&n); 56 scanf("%s",a+1); 57 for(int i=1;i<=n;i++) 58 { 59 if(a[i]=='a') {b[i]=1; c[i][1]='b'; continue;} 60 if(a[i]=='z') {b[i]=1; c[i][1]='y'; continue;} 61 b[i]=2; c[i][1]=a[i]+1; c[i][2]=a[i]-1; 62 } 63 // for(int i=1;i<=n;i++) printf("%d ",b[i]); 64 65 int flag=1; 66 for(int i=1;i<=n/2;i++) 67 { 68 int t=0; 69 for(int j=1;j<=b[i];j++) 70 for(int k=1;k<=b[n-i+1];k++) 71 if(c[i][j]==c[n-i+1][k]) t=1; 72 if(t==0) flag=0; 73 } 74 if(flag) printf("YES "); 75 else printf("NO "); 76 } 77 return 0; 78 }