【ZOJ 4060】Flippy Sequence
【链接】 我是链接,点我呀:)
【题意】
【题解】
按照两个区间的排列方式 我们可以分成以下几种情况 ![](https://img2018.cnblogs.com/blog/1251265/201811/1251265-20181107092457518-1766840129.png) 会发现这两个区间的作用 最多只能把两段连续不同的区间变为相同。 那么写个for处理出连续不相同的一段的个数cnt。 根据上面的排列方式。 算出每个cnt对应的答案即可。 别忘了有些情况可以乘2.【代码】
#include <bits/stdc++.h>
#define ll long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
using namespace std;
const int N = 1e6;
int n;
char s[N+10],t[N+10];
vector<pair<int,int> > v;
int main(){
#ifdef ccy
freopen("rush.txt","r",stdin);
#endif
int T;
scanf("%d",&T);
while (T--){
scanf("%d",&n);
scanf("%s",s+1);
scanf("%s",t+1);
v.clear();
int l = 0,r = 0;
rep1(i,1,n){
if (s[i]!=t[i]){
if (l==0) l = i;
r = i;
}else{
if (l!=0){
v.push_back(make_pair(l,r));
l = 0;
}
}
}
if (l!=0) v.push_back(make_pair(l,r));
int cnt = v.size();
ll ans = 0;
if (cnt==0){
ans+=1LL*n*(n+1)/2;
printf("%lld\n",ans);
continue;
}
if (cnt==1){
ans+=1LL*(v[0].first-1+n-v[0].second)*2;
ans+=1LL*(v[0].second-v[0].first)*2;
printf("%lld\n",ans);
continue;
}
if (cnt==2){
ans+=6;
printf("%lld\n",ans);
continue;
}
puts("0");
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· DeepSeek V3 两周使用总结
· 回顾我的软件开发经历(1)
· C#使用yield关键字提升迭代性能与效率
· 低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解
· 4. 使用sql查询excel内容
2017-11-07 【Codeforces Round #299 (Div. 2) C】 Tavas and Karafs
2017-11-07 【Codeforces Round #299 (Div. 2) B】Tavas and SaDDas
2017-11-07 【Codeforces Round #299 (Div. 2) A】 Tavas and Nafas