社区讨论
求助
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 条回复,欢迎继续交流。
正在加载回复...