社区讨论

请求加强民间数据

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 条回复,欢迎继续交流。

正在加载回复...