T1 幸运回文
说明
小明最近学习了回文串的概念:一个字符串从左往右看和从右往左看是相同的话,那么这个字符串则被称为回文串,例如 akka,aka,aaa,akaka
而众所周知,对于一个 OI 选手的最高目标就是 ak 一场比赛(表示通过所有题目)
现在小明想知道,如果给出一个仅包含 a 和 k 的字符串,在允许任意次的将两个相邻字母替换成 ak 的情况下
这个字符串能否变成一个回文串?
数据范围
数据编号 | n,len | 特殊性质 |
1 | n==1 | 答案为Yes |
2 | n==1 | 答案为No |
3~10 | 1<=n,len<=1000 | 无 |
对于100%的数据:1<=n,len<=1000
输入格式
第一行一个整数表示有 n 个字符串
接下来 n 行每行一个仅包含 a,k 的字符串
设 len 为字符串长度
输出格式
对于每个字符串,若可以变换成回文串则输出 "Yes",否则输出 "No"
样例
输入
3
ak
kka
akaaa
输出
No
Yes
Yes
T1题解
根据题目中说的允许任意次的将两个相邻字母替换成 ak,我们可以知道通过ak的叠加在本题的字符串中我们可以把中间的字符都变成a,例如:
kakkakak可以变成kaaaaaak
或者利用可以不断叠加的性质把这个字符串的中间都变为k,例如:
aakakaka可以变成akkkkkka
这样就可以把一个本不为回文串的字符串变成回文串,但虽然中间的字符都可以变换但开头和结尾两个字符却是不能改变的
所以这时候我们就仅需判断开头和结尾两个字符:
1.若开头和结尾两个字母为a和a,那么这种字符串无需改变开头和结尾是可以变为回文串的
2.若开头和结尾两个字母为a和k,那么无论如何改变开头和结尾都无法变成a,a或k,k
3.若开头和结尾两个字母为k和k,那么这种字符串无需改变开头和结尾是可以变为回文串的
4.若开头和结尾两个字母为k和a,那么因为可以重叠着改变相邻的两个字母变成ak,所以我们能够把结尾的a改变成k,可以变为回文串
经过分类讨论后我们可以知道只要收尾两个字母不分别为a,k那么这个字符串肯定可以变为回文串
所以这一道题目在被化简后就是一道很简单的分类讨论的题目
T1 AC代码
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main()
{
// freopen("ak.in","r",stdin);
// freopen("ak.out","w",stdout);
cin>>n;
while(n--){
cin>>s;//输入
if (s.size()==2){//注意特判字符串长度为2的情况
if (s[0]==s[1]){
printf("Yes\n");
}
else{
printf("No\n");
}
}
else{
//如果开头和结尾分别为a和k那么这个字符串就无法变成回文串
if (s[0]=='a'&&s[s.size()-1]=='k'){
printf("No\n");
}
//反之则可以
else{
printf("Yes\n");
}
}
}
return 0;
}