国庆模拟赛day5复盘 T1幸运回文

T1 幸运回文

说明

小明最近学习了回文串的概念:一个字符串从左往右看和从右往左看是相同的话,那么这个字符串则被称为回文串,例如 akka,aka,aaa,akaka

而众所周知,对于一个 OI 选手的最高目标就是 ak 一场比赛(表示通过所有题目)

现在小明想知道,如果给出一个仅包含 a 和 k 的字符串,在允许任意次的将两个相邻字母替换成 ak 的情况下

这个字符串能否变成一个回文串?

数据范围

数据编号n,len特殊性质
1n==1答案为Yes
2n==1答案为No
3~101<=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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值