QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#360081 | #6299. Binary String | jinqihao2023 | TL | 1594ms | 20204kb | C++14 | 2.3kb | 2024-03-21 11:20:12 | 2024-03-21 11:20:12 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int T,n,a[N],b[N],c[N];
string s;
int prt[N],sum[N],r[N],ans[N],ans1[N],ansx[N];
int gd(int x,int y){return (y-x+c[0])%c[0];}
int gf(int x){if(x==prt[x])return x;return prt[x]=gf(prt[x]);}
int nxt[N];
int main()
{
// freopen("1.in","r",stdin);
scanf("%d",&T);
int cntt=0;
while(T--)
{
cin>>s,n=s.length(),s=' '+s;
for(int i=1;i<=n;i++)a[i]=s[i]-'0';
int cnt0=0,cnt1=0;
for(int i=1;i<=n;i++)if(a[i])cnt1++;else cnt0++;
if(cnt1>cnt0){for(int i=1;i<=n;i++)a[i]^=1;reverse(a+1,a+n+1);}
b[0]=c[0]=0;
for(int i=1;i<=n;i++)if(a[i]==0)
{
for(int j=i%n+1;j!=i;j=j%n+1)b[++b[0]]=a[j];
b[++b[0]]=a[i];
}
int now=0;
for(int i=1;i<=n;i++)
{
if(b[i])now++;
else c[++c[0]]=now,now=0;
}
for(int i=1;i<=c[0];i++)prt[i]=i,sum[i]=c[i];
// for(int i=1;i<=c[0];i++)printf("%d ",c[i]);printf("\n");
vector<int>temp;
for(int i=1;i<=c[0];i++)if(c[i])temp.push_back(i);
int len=temp.size();
queue<pair<int,int> >q;
for(int i=0;i<len;i++)
{
int j=(i+1)%len;r[temp[i]]=(temp[j]-2+c[0])%c[0]+1;
// cout<<temp[i]<<" "<<temp[j]<<" "<<c[temp[i]]<<" "<<gd(temp[i],temp[j])<<" "<<r[temp[i]]<<endl;
if(gd(temp[i],temp[j])<c[temp[i]])q.push({temp[i],temp[j]});
}
while(!q.empty())
{
int x=q.front().first,y=q.front().second;q.pop();
x=gf(x),y=gf(y);if(x==y)continue;
prt[y]=x,sum[x]+=sum[y],r[x]=r[y];
int j=gf(r[x]%c[0]+1);
// cout<<x<<" "<<y<<" "<<j<<endl;
if(j!=x && gd(x,j)<sum[x])q.push({x,j});
}
for(int i=1;i<=c[0];i++)ansx[i]=0;
int ans=0;
for(int i=0;i<len;i++)if(prt[temp[i]]==temp[i])
{
// cout<<temp[i]<<" "<<sum[temp[i]]<<endl;
ans=max(ans,sum[temp[i]]-1);
for(int j=temp[i];j<=temp[i]+sum[temp[i]]-1;j++)ansx[(j-1)%c[0]+1]=1;
}
// cout<<ans<<endl;
// for(int i=1;i<=c[0];i++)printf("%d ",ansx[i]);printf("\n");
int m=0;
for(int i=1;i<=c[0];i++)
{
ans1[++m]=0;
if(ansx[i])ans1[++m]=1;
}
// for(int i=1;i<=m;i++)printf("%d ",ans1[i]);printf("\n");
for(int i=1;i<=n;i++)nxt[i]=0;
for(int i=2;i<=n;i++)
{
nxt[i]=nxt[i-1];
while(nxt[i] && ans1[nxt[i]+1]!=ans1[i])nxt[i]=nxt[nxt[i]];
if(ans1[nxt[i]+1]==ans1[i])nxt[i]++;
}
int now1=nxt[n];
while(n%(n-now1)!=0)now1=nxt[now1];
ans+=n-now1;
printf("%d\n",ans);
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 16036kb
input:
3 1 001001 0001111
output:
1 3 9
result:
ok 3 number(s): "1 3 9"
Test #2:
score: 0
Accepted
time: 431ms
memory: 16036kb
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: 851ms
memory: 20204kb
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: 0
Accepted
time: 1137ms
memory: 14048kb
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:
ok 952358 numbers
Test #5:
score: 0
Accepted
time: 1267ms
memory: 14036kb
input:
645561 001000111110000 01001111000 01011010 110000110111111111 0110100010000100 0 010011 010011111 00000111100001101110101100001 10111111000 100 1101100000001010110110101 1001111101 000100 101 1110101100011111101001111 000111100111100 1111001101011000000 100101001001001010111011011111 10111001100111...
output:
19 14 4 21 18 1 4 11 37 13 3 34 11 6 3 29 21 27 38 24 13 22 26 39 26 31 10 22 1 17 34 40 18 9 29 31 11 3 28 15 20 27 29 16 2 23 18 31 5 14 33 18 1 1 18 7 36 17 34 1 18 6 16 20 19 3 18 36 21 23 21 4 30 12 4 35 16 18 35 2 25 20 31 17 26 24 3 24 6 26 25 17 13 7 24 27 25 18 22 10 20 4 6 23 17 30 16 22 3...
result:
ok 645561 numbers
Test #6:
score: 0
Accepted
time: 1355ms
memory: 14288kb
input:
488486 01101101 011000000100011010101011010 0100101110001011 00111110011110011010001101010000 11010010000010011111011010000010001 01001111001000010110 10110010011010100101010101111 10100000000001 1000010010 0 1111 10001010011011001111100101010 01010111100001011111011110101110101 11100 10101010001101...
output:
8 36 4 17 43 24 33 16 10 1 1 39 38 6 40 30 51 17 41 1 1 12 34 49 44 38 18 47 39 14 35 32 14 36 31 37 23 42 3 10 18 15 21 14 33 11 17 5 18 45 39 31 38 52 27 22 38 15 16 26 30 3 2 3 29 1 41 40 14 17 24 50 21 34 11 31 9 31 18 32 21 43 1 42 39 10 36 27 27 29 15 13 1 24 46 22 21 13 29 13 14 45 47 45 43 1...
result:
ok 488486 numbers
Test #7:
score: 0
Accepted
time: 1594ms
memory: 14052kb
input:
392510 01 00110011011000101011100 0100001010100011111011100011101011111100001110 1011001 00100110000011010 1101110 000100011000001111111100101011110111010111110 0111110000001010111110100011 0100111110000000111101110011011100100 100110000111101101101011011110001101111 111 0000001101011 11101100 10000...
output:
2 26 62 8 19 7 59 34 54 44 1 17 9 43 37 5 1 17 10 30 52 32 11 36 16 37 45 31 12 44 31 45 43 16 11 10 51 41 48 31 22 1 13 1 33 27 25 35 2 5 15 27 6 49 33 3 33 38 52 60 48 28 35 31 25 5 1 44 67 31 36 6 24 31 1 35 56 44 38 36 15 14 49 61 57 61 44 22 38 27 11 51 53 13 30 34 4 56 51 18 2 29 42 51 2 15 9 ...
result:
ok 392510 numbers
Test #8:
score: -100
Time Limit Exceeded
input:
197451 00010111010000100100110001010100100100101001111001000101101001010111100010110101001000001 0000011 11010001011010010010001000011111001110110100111110000010101100110000001100111 0110101110000001001010100 10100010 0110100111 010101000100011001110000000110000000011101010011101 0000110110101011001...
output:
98 8 112 30 8 12 63 96 73 123 10 106 5 106 28 24 101 44 85 109 69 29 104 76 106 111 126 8 106 89 44 36 9 56 9 111 28 37 94 6 102 2 116 19 5 50 32 17 97 114 127 12 26 9 90 133 109 9 66 27 95 1 59 59 93 40 139 84 51 33 101 127 27 1 86 12 95 41 90 134 87 24 109 57 11 85 60 50 4 52 133 66 58 15 41 45 11...