社区讨论

求助

P11361[NOIP2024] 编辑字符串参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m45di407
此快照首次捕获于
2024/12/01 17:02
去年
此快照最后确认于
2025/11/04 13:30
4 个月前
查看原帖
为什么用getchar()读入字符只有60分,换成cin就80分了
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
template<typename type>
inline void read(type &x){
    x=0;
    static bool flag;
    flag=0;
    char ch=getchar();
    while(!isdigit(ch)){
        flag=ch=='-';
        ch=getchar();
    }
    while(isdigit(ch)){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    flag?x=-x:0;
}
struct node{
    int a,b;
}num1[N],num2[N],x,y;
int n;
int t[N];
char s1[N],s2[N];
bool f1[N],f2[N];
void solve(){
    read(n);
    bool flagA=1,flagB=1,flagC=0;
    int cntA=0,cntB=0,cnt=0;
    for(int i=1;i<=n;i++){
//        cin>>s1[i];
        s1[i]=getchar();
        if(s1[i]=='1'){
            num1[i].a=num1[i-1].a+1;
            num1[i].b=num1[i-1].b;
        }
        else{
            num1[i].a=num1[i-1].a;
            num1[i].b=num1[i-1].b+1;
        }
        if(i>1&&s1[i]!=s1[i-1]) flagA=0;
    }
    getchar();
    for(int i=1;i<=n;i++){
//        cin>>s2[i];
        s2[i]=getchar();
        if(s2[i]=='1'){
            num2[i].a=num2[i-1].a+1;
            num2[i].b=num2[i-1].b;
        }
        else{
            num2[i].a=num2[i-1].a;
            num2[i].b=num2[i-1].b+1;
        }
        if(s2[i]==s1[i])cntA++;
    }
    getchar();
    char c;
    for(int i=1;i<=n;i++){
//    	cin>>c;
        c=getchar();
        if(c=='0') f1[i]=0;
        else f1[i]=1;
    }
    for(int i=1;i<=n;i++){
//        cin>>c;
        c=getchar();
        if(c=='0') f2[i]=0;
        else f2[i]=1;
        if(f2[i]!=f1[i]) flagB=0;
    }
    getchar();
    if(flagA){
        printf("%d\n",cntA);
    }
    else if(flagB){
        int d=0;
        for(int i=1;i<=n;i++){
            if(f1[i]==0){
                cntB+=(s1[i]==s2[i]);
                cntB+=min(num1[i-1].a-num1[d].a,num2[i-1].a-num2[d].a)+min(num1[i-1].b-num1[d].b,num2[i-1].b-num2[d].b);
                d=i;
            }
        }
        if(f1[n]!=0) cntB+=min(num1[n].a-num1[d].a,num2[n].a-num2[d].a)+min(num1[n].b-num1[d].b,num2[n].b-num2[d].b);
        printf("%d\n",cntB);
    }
    else{
        bool F=1;
        x.a=y.a=x.b=y.b=0;
        cnt=0;
        for(int i=1;i<=n;i++){
            if(f1[i]==1&&f2[i]==1) t[i]=1;
            if(f1[i]==1&&f2[i]==0) t[i]=2;
            if(f1[i]==0&&f2[i]==1) t[i]=3;
            if(f1[i]==0&&f2[i]==0) t[i]=4;
        }
        int dot=3;
        for(int i=1;i<=n;i++){
            if(t[i]==1){
                x.a+=(s1[i]=='1');
                x.b+=(s1[i]=='0');
                y.a+=(s2[i]=='1');
                y.b+=(s2[i]=='0');
                dot=3;
            }   
            else if(t[i]==2){
                if(dot&1){
                    x.a+=(s1[i]=='1');
                    x.b+=(s1[i]=='0');
                    y.a+=(s2[i]=='1');
                    y.b+=(s2[i]=='0');
                    dot=1;
                }
                else{
                    if(i==n) F=0;
                    cnt+=min(x.a,y.a)+min(x.b,y.b);
                    x.a=(s1[i]=='1');
                    x.b=(s1[i]=='0');
                    y.a=(s2[i]=='1');
                    y.b=(s2[i]=='0');
                    dot=1;
                }
                
            }
            else if(t[i]==3){
                if(dot>1){
                    x.a+=(s1[i]=='1');
                    x.b+=(s1[i]=='0');
                    y.a+=(s2[i]=='1');
                    y.b+=(s2[i]=='0');
                    dot=2;
                }
                else{
                    if(i==n) F=0;
                    cnt+=min(x.a,y.a)+min(x.b,y.b);
                    x.a=(s1[i]=='1');
                    x.b=(s1[i]=='0');
                    y.a=(s2[i]=='1');
                    y.b=(s2[i]=='0');
                    dot=2;
                }
            }
            else{
                if(i==n) F=0;
                cnt+=min(x.a,y.a)+min(x.b,y.b);
                cnt+=(s1[i]==s2[i]);
                x.a=0;
                x.b=0;
                y.a=0;
                y.b=0; 
                dot=3;
            }
        }
        if(F) cnt+=min(x.a,y.a)+min(x.b,y.b);
        printf("%d\n",cnt);
    }
    
    
}
int main(){
    freopen("edit.in","r",stdin);
    freopen("edit.out","w",stdout);
    int T;
    read(T);
    while(T--){
        solve();
    }
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...