【CF1027A】Palindromic Twist(模拟)

题意:输入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 }
原文地址:https://www.cnblogs.com/myx12345/p/9843826.html