园艺工人的求助

【题目描述】
终于,在一段繁忙的训练之后,到了 NOIP 的举办的时候。同学们坐上了大巴车,
享受着沿途的风光,讨论着未解决的问题,憧憬着 NOIP 赛场上切题的样子。很快,大
巴车到了大连大学科技楼,也就是辽宁 NOIP 的举办地点。大连大学科技楼是一幢宏
伟的建筑,楼前摆放有一排花,共有 n 盆。花一共只有 26 种,分别用 26 个小写英文
字母表示,也就是说,楼前的这排花可以用一个仅包含小写英文字母的字符串表示。大
连大学雇了一个园艺工人,专门打理科技楼前的花。园艺工人看见你,热情地向你打招
呼:“ NOIP 加油!”其实,他是有问题想请你帮忙呢!现在园艺工人想再购买一盆花
(可以任选 26 种花中的一种),插入到原来的花中间(可以放在整排花的最左侧与最右
侧),他想知道在插入一盆花后,能否使整排花左右对称。例如, ababa 是左右对称的,
abcd 不是。注意:即使原来的一排花已经是左右对称的,也必须再插入一盆花。
【输入格式】
从文件 flower.in 中读入数据。
本题目有多组数据,输入第一行为一个正整数 t,表示数据组数。
接下来 t 行,每行包含一个正整数 n 和一个长度为 n 的字符串,分别表示花的数
量与花构成的序列。
【输出格式】
输出到文件 flower.out 中。
对于每组数据输出一行。若再插入一盆花之后能使整排花左右对称,输出 Yes,否
则输出 No(注意大小写)。
【样例 1 输入】
4
4 abcd
4 aabb
4 aaaa
10 abcdefecba
【样例 1 输出】
No
No

Yes

Yes
【样例 2
见选手目录下的 flower/flower2.in flower/flower2.ans
【子任务】
对于 20% 的数据, n 5
对于另 30% 的数据, t = 1 n 1000
对于 100% 的数据, n 106
【题解】

详见代码

【代码】

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 #define ll long long 
 7 const int N = 1e6+1;
 8 int t,n;
 9 char map[N];
10 int main()
11 {
12     //freopen("flower.in","r",stdin);
13     //freopen("flower.out","w",stdout);
14     scanf("%d",&t);
15     for(int i = 1;i <= t;i++)
16     {
17         scanf("%d",&n);
18         scanf("%s",map);
19         int p = 0,q = n - 1,sum = 0;
20         bool flag = true;
21         while(p<=q)
22         {
23             if(map[p] == map[q])
24             {
25                 p++;q--;
26             }
27             else
28             {
29                 if(map[p+1] == map[q])
30                 {
31                     p++;
32                     sum++;
33                     if(sum > 1)
34                     {
35                         flag = false;
36                         break;
37                     }
38                 }
39                 else if(map[p] == map[q-1])
40                 {
41                     q--;
42                     sum++;
43                     if(sum > 1)
44                     {
45                         flag = false;
46                         break;
47                     }
48                 }
49                 else 
50                 {
51                     flag = false;
52                     break;
53                 }
54             }
55         }
56         if(flag) printf("Yes
");
57         else printf("No
");
58     }
59     return 0;
60 }
原文地址:https://www.cnblogs.com/peppa/p/9451011.html