题目
给定一个长度为 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;
}