CSES - HIIT Open 2016 - Results
Submission details
Task:Bit strings
Sender:Game of Nolife
Submission time:2016-05-28 13:15:21 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.05 sdetails
#2ACCEPTED0.90 sdetails
#3ACCEPTED0.90 sdetails
#4ACCEPTED0.83 sdetails
#5ACCEPTED0.88 sdetails
#6ACCEPTED0.90 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:79:19: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &tcs);
                   ^
input/code.cpp:81:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s", s);
                 ^

Code

#include <bits/stdc++.h>
#define F first
#define S second
#define X real()
#define Y imag()
using namespace std;
typedef long long ll;
typedef long double ld;
typedef complex<ld> co;
const ld PI=atan2(0, -1);
vector<co> fft(vector<co> x, int d){
int n=(int)x.size();
for (int i=0;i<n;i++){
int u=0;
for (int j=1;j<n;j*=2){
u*=2;
if (i&j) u++;
}
if (i<u){
swap(x[i], x[u]);
}
}
for (int m=2;m<=n;m*=2){
co wm=exp(co{0, d*2*PI/m});
for (int k=0;k<n;k+=m){
co w=1;
for (int j=0;j<m/2;j++){
co t=w*x[k+j+m/2];
co u=x[k+j];
x[k+j]=u+t;
x[k+j+m/2]=u-t;
w*=wm;
}
}
}
if (d==-1){
for (int i=0;i<n;i++){
x[i]/=n;
}
}
return x;
}
vector<ll> conv(vector<ll> a, vector<ll> b){
int as=a.size();
int bs=b.size();
int n=1;
while (n<as+bs-1) n*=2;
vector<co> aa(n*2);
vector<co> bb(n*2);
for (int i=0;i<as;i++){
aa[i]=a[i];
}
for (int i=0;i<bs;i++){
bb[i]=b[i];
}
aa=fft(aa, 1);
bb=fft(bb, 1);
vector<co> c(2*n);
for (int i=0;i<2*n;i++){
c[i]=aa[i]*bb[i];
}
c=fft(c, -1);
c.resize(as+bs-1);
vector<ll> r(as+bs-1);
for (int i=0;i<as+bs-1;i++){
r[i]=(ll)round(c[i].real());
}
return r;
}
char s[101010];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int tcs;
scanf("%d", &tcs);
for (int tc=0;tc<tcs;tc++){
scanf("%s", s);
//string s;
/*
for (int i=0;i<100000;i++){
s+='1';
}*/
int n=strlen(s);
//int n=s.size();
vector<ll> ct(n+1);
ct[0]=1;
int t=0;
ll v0=0;
ll c0=0;
for (int i=0;i<n;i++){
if (s[i]=='1') {
t++;
c0=0;
}
else{
c0++;
v0+=c0;
}
ct[t]++;
}
vector<ll> lol=ct;
reverse(lol.begin(), lol.end());
vector<ll> cv=conv(ct, lol);
printf("%lld ", v0);
for (int i=n-1;i>=0;i--){
printf("%lld ", cv[i]);
}
printf("\n");
}
}

Test details

Test 1

Verdict: ACCEPTED

input
20
00011000100111001100
00001001111111100010
10110011110101111101
01111011010010100111
...

correct output
21 33 39 30 23 20 25 7 12 0 0 ...

user output
21 33 39 30 23 20 25 7 12 0 0 ...

Test 2

Verdict: ACCEPTED

input
1
001010110001110001110000110011...

correct output
99028 198023 199224 198569 199...

user output
99028 198023 199224 198569 199...

Test 3

Verdict: ACCEPTED

input
1
111010111001001100100101011110...

correct output
99270 199585 198291 199812 198...

user output
99270 199585 198291 199812 198...

Test 4

Verdict: ACCEPTED

input
20
001001010011101100110111110010...

correct output
5022 10235 10021 9985 10019 99...

user output
5022 10235 10021 9985 10019 99...

Test 5

Verdict: ACCEPTED

input
10
110101000110110101011011101010...

correct output
9955 20073 20158 19923 20014 1...

user output
9955 20073 20158 19923 20014 1...

Test 6

Verdict: ACCEPTED

input
1
111111111111111111111111111111...

correct output
968 100966 100967 100965 10096...

user output
968 100966 100967 100965 10096...