社区讨论
请求加强民间数据
P11361[NOIP2024] 编辑字符串参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m4caab26
- 此快照首次捕获于
- 2024/12/06 13:06 去年
- 此快照最后确认于
- 2024/12/06 13:47 去年
rt, 过不了大样例,但是AC民间数据。
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100005;
int T,n;
string s[3],t[3];
int sum[3][N],lst[3][N],nxt[3][N]; // lst/nxt : qian/hou mian di yi ge yu ta butong
vector<int> pos;
int count(int i,int l,int r){
return sum[i][r]-sum[i][l-1];
}
bool chk(int x,int l,int r){
return count(x,l,r)==(r-l+1);
}
priority_queue<int> q[2];
void man(){
cin>>n;
cin>>s[1]>>s[2]>>t[1]>>t[2];
s[1]=" "+s[1]+" ";
s[2]=" "+s[2]+" ";
t[1]=" "+t[1]+" ";
t[2]=" "+t[2]+" ";
bool flag1=1,flag2=1;
for(int i=2;i<=n;i++)flag1&=(s[1][i]==s[1][i-1]);
for(int i=1;i<=n;i++){
sum[1][i]=sum[1][i-1]+(t[1][i]=='1');
sum[2][i]=sum[2][i-1]+(t[2][i]=='1');
}
// for(int i=1;i<=n;i++)cout<<sum[1][i]<<' ';puts("");
// for(int i=1;i<=n;i++)cout<<sum[2][i]<<' ';puts("");
if(flag1){
int ans=0;
for(int i=1;i<=n;i++)
ans+=(s[1][i]==s[2][i]);
cout<<ans<<'\n';
return;
}
int ans=0;
for(int i=1;i<=n;i++){
if(s[1][i]==s[2][i])ans++;
else if(s[1][i]!=s[2][i]&&(t[1][i]=='1'||t[2][i]=='1')){
pos.push_back(i);
}
}
for(int i=0;i<pos.size();i++){
if(s[1][pos[i]]=='1')q[1].push(-pos[i]);
else q[0].push(-pos[i]);
}
while(!q[0].empty()&&!q[1].empty()){
int i=-q[0].top(),j=-q[1].top();
if(i<j){
if(chk(1,i,j)){
swap(s[1][i],s[1][j]);
q[0].pop();
q[1].pop();
}else if(chk(2,i,j)){
swap(s[2][i],s[2][j]);
q[0].pop();
q[1].pop();
}
else{
if(t[1][i]=='1'&&t[1][i+1]=='1'&&s[1][i]!=s[1][i+1]){
q[0].pop();
q[0].push(-(i+1));
swap(s[1][i],s[1][i+1]);
}else if(t[2][i]=='1'&&t[2][i+1]=='1'&&s[2][i]!=s[2][i+1]){
q[0].pop();
q[0].push(-(i+1));
swap(s[2][i],s[2][i+1]);
}else q[0].pop();
}
}else{
if(chk(1,j,i)){
swap(s[1][j],s[1][i]);
q[0].pop();
q[1].pop();
}else if(chk(2,j,i)){
swap(s[2][j],s[2][i]);
q[0].pop();
q[1].pop();
}else{
if(t[1][j]=='1'&&t[1][j+1]=='1'&&s[1][j]!=s[1][j+1]){
q[1].pop();
q[1].push(-(j+1));
swap(s[1][j],s[1][j+1]);
}else if(t[2][j]=='1'&&t[2][j+1]=='1'&&s[2][j]!=s[2][j+1]){
q[1].pop();
q[1].push(-(j+1));
swap(s[2][j],s[2][j+1]);
}else q[1].pop();
}
}
// priority_queue<int> qq[2];
// qq[0]=q[0],qq[1]=q[1];
// while(!qq[0].empty())cout<<-qq[0].top()<<' ',qq[0].pop();puts("");
// while(!qq[1].empty())cout<<-qq[1].top()<<' ',qq[1].pop();puts("");
}
ans=0;
for(int i=1;i<=n;i++)ans+=(s[1][i]==s[2][i]);
cout<<ans<<'\n';
while(!q[0].empty())q[0].pop();
while(!q[1].empty())q[1].pop();
memset(sum,0,sizeof sum);
pos.clear();
}
int main(){
cin>>T;
while(T--)man();
return 0;
}
思路就是能配就配,只不过我这个啥比写的依托时,导致无法通过大样例。
回复
共 0 条回复,欢迎继续交流。
正在加载回复...