[NOIP2024] 编辑字符串
比较简单的贪心
首先按照
然后可以知道,如果对一个位置
上述做法的正确性可以用决策包容性证明。简单来说,就是任意一个位置对答案的贡献只有
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int n;
char s1[N],s2[N],t1[N],t2[N];
int mark[N],belong[2][N],sum[N][2],cnt;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
cnt=0;//cnt记录段的数量
for(int i=1;i<=n;i++)
{
for(int j=0;j<=1;j++) belong[j][i]=sum[i][j]=0;
//belong[0/1][i]表示s1/s2的位置i所属的段的标号
//sum[i][0/1]表示编号为i的段的0/1的个数
mark[i]=0;//mark[i]表示位置i的类别
}
scanf("%s%s",s1,s2);
scanf("%s%s",t1,t2);
for(int i=1;i<=n;i++)
if(t1[i-1]=='1') mark[i]++;
for(int i=1;i<=n;i++)
if(t2[i-1]=='1') mark[i]+=2;
for(int i=1;i<=n;i++)
if(t1[i-1]=='1')
{
cnt++;
int j=i;
while(j<=n&&t1[j-1]=='1')
{
belong[0][j]=cnt;
sum[cnt][s1[j-1]-'0']++;
j++;
}
i=j-1;
}
for(int i=1;i<=n;i++)
if(t2[i-1]=='1')
{
cnt++;
int j=i;
while(j<=n&&t2[j-1]=='1')
{
belong[1][j]=cnt;
sum[cnt][s2[j-1]-'0']++;
j++;
}
i=j-1;
}
int ans=0;
for(int i=1;i<=n;i++)
if(!mark[i]&&s1[i-1]==s2[i-1]) ans++;
for(int i=1;i<=n;i++)
if(mark[i]==1&&sum[belong[0][i]][s2[i-1]-'0'])
{
sum[belong[0][i]][s2[i-1]-'0']--;
ans++;
}
else if(mark[i]==2&&sum[belong[1][i]][s1[i-1]-'0'])
{
sum[belong[1][i]][s1[i-1]-'0']--;
ans++;
}
for(int i=1;i<=n;i++)
if(mark[i]==3)
{
if(sum[belong[0][i]][0]&&sum[belong[1][i]][0])
{
ans++;
sum[belong[0][i]][0]--,sum[belong[1][i]][0]--;
}
if(sum[belong[0][i]][1]&&sum[belong[1][i]][1])
{
ans++;
sum[belong[0][i]][1]--,sum[belong[1][i]][1]--;
}
}
printf("%d\n",ans);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2024-01-18 陨石的秘密
2024-01-18 减操作
2024-01-18 低买
2024-01-18 移动服务
2024-01-18 分级
2024-01-18 滑雪
2024-01-18 开垦农田