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;
}

浙公网安备 33010602011771号