CF1634A

题面

简单分析容易发现,若 \(s=rev(s)\),则无论 \(rev(s)\) 放在前面还是后面,生成的新串都相同,只有一种情况。

相反,如果 \(s\neq rev(s)\),则一次操作后可以出现两种情况。而无论是哪种情况,生成的新串都是回文串,即 \(s'=rev(s')\),根据乘法原理,后面的情况数都是前一个情况数 \(\times 1\),也就是说都不会再增添新的情况数。

因此有结论:如果 \(s\) 回文,则最终情况数是 \(1\),否则是 \(2\)
以及特判:\(k=0\) 时,答案为 \(1\),因为没有操作,只有一种情况。

代码:

#include<bits/stdc++.h>
using namespace std;
constexpr int N=100005;
int n,a[N];double m;
int main(){
	int t;cin>>t;
    while(t--){
        int n,k;scanf("%d%d",&n,&k);
        char s[105];scanf("%s",s+1);
        bool flg=0;
        for(int i=1;i<=n/2;i++)if(s[i]!=s[n-i+1]){flg=1;break;}
        puts(flg&&k?"2":"1");
    }
	return 0;
}
posted @ 2023-04-24 19:32  untitled0  阅读(25)  评论(0)    收藏  举报