Task: | Bit strings |
Sender: | Game of Nolife |
Submission time: | 2016-05-28 13:15:21 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.05 s | details |
#2 | ACCEPTED | 0.90 s | details |
#3 | ACCEPTED | 0.90 s | details |
#4 | ACCEPTED | 0.83 s | details |
#5 | ACCEPTED | 0.88 s | details |
#6 | ACCEPTED | 0.90 s | details |
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... |