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 @   untitled0  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示