Codeforces Round#770(Div.2) A. Reverse and Concatenate

题目

给定一个长度为 n 的字符串 s 和一个数字 k。让我们用 rev(s) 表示反转的字符串 s(即 rev(s)=sn−1…s1)。您可以对字符串应用以下两种操作之一:

用 s+rev(s) 替换字符串 s
用 rev(s)+s 替换字符串 s
由于对原始字符串 s 执行恰好 k 个操作(可能是不同种类的操作),您可以获得多少个不同的字符串?

在该语句中,我们将字符串 s 和 t 的连接表示为 s+t。换句话说,s+t=s1s2…snt1t2…tm,其中 n 和 m 分别是字符串 s 和 t 的长度。

输入

第一行包含一个整数 t (1≤t≤100) — 测试用例的数量。接下来的 2⋅t 行包含 t 个测试用例:

测试用例的第一行包含两个整数 n 和 k (1≤n≤100, 0≤k≤1000)——分别是字符串的长度和操作数。

测试用例的第二个字符串包含一个长度为 n 的字符串 s,由小写拉丁字母组成。

输出

对于每个测试用例,在单独的行上打印答案(即,在恰好 k 次操作之后可以得到的不同字符串的数量)。

可以证明,在给定的约束条件下,答案不超过 109

题解

如果 k=0,则答案为 1。否则,考虑两种情况:

该字符串是一个回文(即 s=rev(s))。 那么rev(s)+s=s+rev(s)=s+s,所以这两个操作都会将s替换为字符串s+s,这也是一个回文。 那么对于任何 k 答案都是 1。
否则 s≠rev(s)。 然后在第一次操作之后,我们得到 s+rev(s)(这是一个回文)或 rev(s)+s(也是一个回文)。 还要注意,如果我们对长度为 x 的两个不同回文数多次应用该操作,它们不会相等,因为它们没有相同的长度为 x 的前缀。 因此,在非回文的第一次操作之后,将获得 2 个不同的字符串,并且在所有后续操作之后,将获得 2 个不相等的字符串。 所以答案是——2。

#include<stdio.h>
#include<string.h>
char s[105];
int main(){
	int t,n,k;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%s",&n,&k,s);
		int ans=1;
		for(int i=0,j=n-1;i<j;i++,j--)
			if(s[i]!=s[j]&&k)ans=2;
		printf("%d\n",ans);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值