园艺工人的求助
【题目描述】
终于,在一段繁忙的训练之后,到了 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\n"); 57 else printf("No\n"); 58 } 59 return 0; 60 }