社区讨论
救救孩子吧 必关
P14835[THUPC 2026 初赛] 又一个 01 串问题参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mjihc97b
- 此快照首次捕获于
- 2025/12/23 19:06 2 个月前
- 此快照最后确认于
- 2025/12/26 12:25 2 个月前
WA,赛时调了 。
代码
CPP#include<bits/stdc++.h>
using namespace std;
string s,ans1,ans2,ans3;
int nxt[500010],pre[500010];
string sum(string sa,string sb)
{
//cout<<sa<<" "<<sb<<endl;
if(sa.length()<sb.length())swap(sa,sb);
string ans;
bool flag=0,x,y;
for(int i=sa.length()-1;i>=0;i--)
{
if(i<sa.length()-sb.length())y=0;
else if(sb[i-(sa.length()-sb.length())]=='1')y=1;
else y=0;
if(sa[i]=='1')x=1;
else x=0;
if((!x)&&(!y))
{
if(flag)ans="1"+ans;
else ans="0"+ans;
flag=0;
}
else if(((!x)&&y)||(x&&(!y)))
{
if(flag)ans="0"+ans,flag=1;
else ans="1"+ans,flag=0;
}
else
{
if(flag)ans="1"+ans;
else ans="0"+ans;
flag=1;
}
//cout<<ans<<" "<<x<<" "<<y<<" "<<flag<<endl;
}
if(flag)ans="1"+ans;
while(ans.length()>1&&ans[0]=='0')ans.erase(0,1);
return ans;
}
string cmp(string sa,string sb)
{
if(sa.length()>sb.length())return sb;
if(sa.length()<sb.length())return sa;
for(int i=0;i<sa.length();i++)
{
if(sa[i]>sb[i])return sb;
if(sa[i]<sb[i])return sa;
}
return sa;
}
int main()
{
// freopen("data.out","r",stdin);
// freopen("THUPC.out","w",stdout);
int t,n,p,fi,x,y,a,b,c;
bool flag;
cin>>t;
while(t--)
{
cin>>n>>s;
p=-1;
for(int i=0;i<n;i++)
{
if(s[i]=='1')
{
if(p!=-1)nxt[p]=i;
if(p==-1)fi=i;
pre[i]=p;
p=i;
}
}
if(p==-1)
{
cout<<"0"<<endl;
continue;
}
nxt[p]=-1;
flag=0;
for(int i=fi;i!=-1;i=nxt[i])
{
x=i-fi+1;
if(nxt[i]!=-1)y=n-nxt[i];
else y=0;
if(x==y)
{
flag=1;
a=pre[i];
b=i;
c=nxt[i];
break;
}
if(x>y)
{
a=pre[i];
b=i;
break;
}
}
if(flag)
{
if(a!=n-1)ans1=sum(s.substr(0,a+1),s.substr(a+1,n-(a+1)));
else ans1=sum(s,"");
if(b!=n-1)ans2=sum(s.substr(0,b+1),s.substr(b+1,n-(b+1)));
else ans2=sum(s,"");
if(c!=n-1)ans3=sum(s.substr(0,c+1),s.substr(c+1,n-(c+1)));
else ans3=sum(s,"");
cout<<cmp(ans1,cmp(ans2,ans3))<<endl;
}
else
{
if(a!=n-1)ans1=sum(s.substr(0,a+1),s.substr(a+1,n-(a+1)));
else ans1=sum(s,"");
if(b!=n-1)ans2=sum(s.substr(0,b+1),s.substr(b+1,n-(b+1)));
else ans2=sum(s,"");
//cout<<ans1<<" "<<ans2<<endl;
cout<<cmp(ans1,ans2)<<endl;
}
}
return 0;
}
求调,玄关。
回复
共 4 条回复,欢迎继续交流。
正在加载回复...