QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#628564 | #6299. Binary String | hwpvector | WA | 340ms | 9744kb | C++20 | 2.7kb | 2024-10-10 20:55:10 | 2024-10-10 20:55:14 |
Judging History
answer
#include <bits/stdc++.h>
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
using namespace std;
const int N=1e7+10;
int sum[N],vis[N],v[N<<1],l[N<<1],a[N],fail[N];
vector<pii> p;
string str;
void solve() {
cin>>str; int n=str.size(); str=" "+str+" ";
int sum0=0,sum1=0,m=0; p.clear();
for (int i=1;i<=n;i++) {
if (str[i]=='0') ++sum0;
else ++sum1;
}
if (!sum0||!sum1) {cout<<1<<'\n';return ;}
if (sum1<sum0) {
for (int i=1;i<=n;i++) {
if (str[i]=='0') str[i]='1';
else str[i]='0';
} reverse(str.begin(),str.end());
}
for (int i=2,j=1;i<=n+1;i++) {
if (str[i]==str[i-1]) ++j;
else if (str[i-1]=='0') v[++m]=-j,j=1;
else v[++m]=j,j=1;
}
// for (int i=1;i<=m;i++) cout<<v[i]<<' '; cout<<'\n';
if (str[1]==str[n]) v[1]+=v[m],--m;
int mn=0x3f3f3f3f,s;
for (int i=1;i<=m;i++) {
sum[i]=sum[i-1]+v[i];
if (mn>=sum[i]) mn=sum[i],s=i;
}
for (int i=1;i<=m;i++) v[i+m]=v[i];
// for (int i=s+1;i<=s+m;i++) cout<<v[i]<<' '; cout<<'\n';
l[s+1]=1;
for (int i=s+2;i<=s+m;i++)
l[i]=l[i-1]+abs(v[i-1]);
int ans=0;
vector<pii> t;
for (int i=s+m,s0=0,R=0;i>=s+1;i-=2) {
v[i]+=1,v[i-1]-=1;
s0+=-v[i]; if (!R) R=l[i]-v[i]-1;
if (s0>v[i-1]) {
// int cnt=0,x=v[i-1];
// for (auto it=t.rbegin();it!=t.rend();it++) {
// int &l=it->fi,&d=it->se;
// if (d>=x) {l=l+x;d-=x;if (d==0) ++cnt;break;}
// ++cnt; x-=d;
// }
// while (cnt--) t.pop_back();
s0-=v[i-1];
}
else {
int L=l[i-1]+v[i-1]-s0; // cout<<L<<' '<<R<<'\n';
if (v[i-1]-s0!=0) p.pb({l[i-1],v[i-1]-s0+1});
// cout<<t[0].fi<<' '<<t[0].se<<' '<<L<<'\n';
// assert((R-L)%2==0);
ans=max((R-L)/2,ans); s0=R=0;
}
}
// cout<<ans<<'\n';
for (auto [l,d]:p) {
// cout<<l<<' '<<d<<'\n';
for (int i=1,j=(l+ans-1)%n+1;i<=d;i++,j=j%n+1) a[j]=1;
}
if (p.empty()) {
for (int i=1,j=0;i<=n;i++,j^=1) a[i]=j;
}
else {
for (int i=1;!vis[i];) {
if (a[i]==1) {
int j; vis[i]=1;
for (i=i+1,j=0;a[i]!=1;i=i%n+1,j^=1) a[i]=j,vis[i]=1;
}
else i=i%n+1;
}
}
// for (int i=1;i<=n;i++) cout<<a[i]; cout<<'\n';
fail[1]=0;
for (int i=2,j=0;i<=n;i++) {
while (j!=0&&a[i]!=a[j+1]) j=fail[j];
if (a[i]==a[j+1]) ++j;
fail[i]=j;
}
// for (int i=1;i<=n;i++) cout<<fail[i]<<' '; cout<<'\n';
if (n%(n-fail[n])==0) ans+=n-fail[n];
else ans+=n;
cout<<ans<<'\n';
for (int i=1;i<=n;i++) a[i]=0,vis[i]=0;
}
// 1111011100111100
// 0111101101011101
// 1011110110101110
// 3 -> 2, - 1
// 2 +
// 0001111
// 0010111
// 567
// - 2
// 7 +
// 0101011
// 1010101
// 1101010
// 0110101
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int T; cin>>T; while (T--) solve();
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 9716kb
input:
3 1 001001 0001111
output:
1 3 9
result:
ok 3 number(s): "1 3 9"
Test #2:
score: 0
Accepted
time: 105ms
memory: 9744kb
input:
262144 000000000000000000 100000000000000000 010000000000000000 110000000000000000 001000000000000000 101000000000000000 011000000000000000 111000000000000000 000100000000000000 100100000000000000 010100000000000000 110100000000000000 001100000000000000 101100000000000000 011100000000000000 11110000...
output:
1 18 18 19 18 18 19 20 18 18 18 20 19 19 20 21 18 18 18 19 18 18 20 21 19 19 19 21 20 20 21 22 18 18 18 19 18 18 19 21 18 18 18 21 20 20 21 22 19 19 19 19 19 19 21 22 20 20 20 22 21 21 22 23 18 18 18 19 18 18 19 20 18 18 18 20 19 19 21 22 18 18 18 19 18 18 21 22 20 20 20 22 21 21 22 23 19 19 19 19 1...
result:
ok 262144 numbers
Test #3:
score: 0
Accepted
time: 220ms
memory: 9720kb
input:
524288 0000000000000000000 1000000000000000000 0100000000000000000 1100000000000000000 0010000000000000000 1010000000000000000 0110000000000000000 1110000000000000000 0001000000000000000 1001000000000000000 0101000000000000000 1101000000000000000 0011000000000000000 1011000000000000000 0111000000000...
output:
1 19 19 20 19 19 20 21 19 19 19 21 20 20 21 22 19 19 19 20 19 19 21 22 20 20 20 22 21 21 22 23 19 19 19 20 19 19 20 22 19 19 19 22 21 21 22 23 20 20 20 20 20 20 22 23 21 21 21 23 22 22 23 24 19 19 19 20 19 19 20 21 19 19 19 21 20 20 22 23 19 19 19 20 19 19 22 23 21 21 21 23 22 22 23 24 20 20 20 20 2...
result:
ok 524288 numbers
Test #4:
score: -100
Wrong Answer
time: 340ms
memory: 9716kb
input:
952358 0011101111 101010101101 101111111010100 0101011000110001100 0101111101110 010 100100000111011 011010110110011 1010111 1 1111101010 11111011001111110 0101101101011 001 1100111100 100011 10 10 0001 011100 1100010 111111101010010 01001111110011011 01100 1010 10101111 01000111100011111110 10101 0...
output:
11 12 18 20 14 3 21 16 7 1 10 18 13 3 11 4 2 2 4 4 8 18 19 6 2 8 24 5 1 1 5 25 1 14 1 15 20 3 7 24 12 10 20 21 23 1 22 18 22 5 1 6 18 12 1 4 5 12 13 12 21 1 5 12 21 8 1 8 18 4 1 12 13 6 3 3 16 6 8 1 1 17 1 1 1 6 6 4 4 10 7 5 4 5 24 6 11 4 8 15 3 9 9 19 5 16 11 5 6 9 17 1 25 14 6 1 4 20 1 4 20 14 14 ...
result:
wrong answer 36467th numbers differ - expected: '9', found: '16'