Task: | Matching |
Sender: | Tuukka Korhonen |
Submission time: | 2016-10-22 14:33:06 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.05 s | details |
#2 | ACCEPTED | 0.20 s | details |
#3 | ACCEPTED | 0.07 s | details |
#4 | ACCEPTED | 0.09 s | details |
#5 | ACCEPTED | 0.08 s | details |
#6 | ACCEPTED | 0.12 s | details |
#7 | ACCEPTED | 1.48 s | details |
#8 | ACCEPTED | 0.14 s | details |
#9 | ACCEPTED | 0.16 s | details |
#10 | ACCEPTED | 0.14 s | details |
#11 | ACCEPTED | 0.15 s | details |
#12 | ACCEPTED | 0.72 s | details |
Compiler report
input/code.cpp: In function 'int main()': input/code.cpp:75:22: warning: format '%s' expects argument of type 'char*', but argument 2 has type 'char (*)[404040]' [-Wformat=] scanf("%s%s", &p, &s); ^ input/code.cpp:75:22: warning: format '%s' expects argument of type 'char*', but argument 3 has type 'char (*)[404040]' [-Wformat=] input/code.cpp:75:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result] scanf("%s%s", &p, &s); ^
Code
#include <bits/stdc++.h> #define F first #define S second #define X real() #define Y imag() using namespace std; typedef double ld; typedef long long ll; typedef complex<ld> co; const ld PI=atan2(0, -1); vector<co> fft(vector<co> x, int d) { int n=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(complex<ld>{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; } pair<vector<co>, vector<co> > tfft(vector<co>& a, vector<co>& b, int d) { vector<co> fv(a.size()); for (int i=0;i<(int)a.size();i++) fv[i]=a[i]+co(0, 1)*b[i]; fv=fft(fv, d); vector<co> r1(a.size()), r2(a.size()); for (int i=0;i<(int)a.size();i++) { if (d==-1||i==0||i==(int)a.size()/2) { r1[i]=fv[i].X;r2[i]=fv[i].Y; } else { co t=fv[i]-fv[(int)a.size()-i]; r1[i]={fv[i].X-t.X/2, t.Y/2}; r2[i]=(fv[i]-r1[i])*co(0, -1); } } return {r1, r2}; } pair<vector<ll>, vector<ll>> tconv(int as, int bs, int n, vector<co>& a, vector<co>& b, vector<co>& c, vector<co>& d){ auto ab=tfft(a, b, 1); auto cd=tfft(c, d, 1); vector<co> c1(2*n); vector<co> c2(2*n); for (int i=0;i<2*n;i++) c1[i]=ab.F[i]*ab.S[i]; for (int i=0;i<2*n;i++) c2[i]=cd.F[i]*cd.S[i]; auto r=tfft(c1, c2, -1); vector<ll> r1(as+bs-1), r2(as+bs-1); for (int i=0;i<as+bs-1;i++) { r1[i]=(ll)round(r.F[i].X); r2[i]=(ll)round(r.S[i].X); } return {r1, r2}; } int ma[404040]; char p[404040]; char s[404040]; int main(){ scanf("%s%s", &p, &s); int psize=strlen(p); int ssize=strlen(s); int q=0; for (int i=0;i<psize;i++) { if (p[i]=='?') q++; } int chs=0; int vs=ssize-psize+1; for (char ch='a';ch<='z';){ vector<int> okk; for (int i=0;i<vs;i++){ if (ma[i]==chs) okk.push_back(i); } vector<int> ck; for (int i=0;i<psize;i++){ if (p[i]==ch) ck.push_back(i); } if ((ll)ck.size()*(ll)okk.size()<5e7){ chs+=(int)ck.size(); for (int o:okk){ for (int c:ck){ if (c+o>=ssize) break; if (s[c+o]==ch){ ma[o]++; } } } ch++; } else{ int as=psize; int bs=ssize; int n=1; while (n<as+bs-1) n*=2; vector<co> a(n*2), b(n*2), c(n*2), d(n*2); for (int i=0;i<psize;i++){ if (p[i]==ch) { a[as-1-i]=1; chs++; } else if(p[i]==ch+1) { c[as-1-i]=1; chs++; } } for (int i=0;i<ssize;i++){ if (s[i]==ch) b[i]=1; else if(s[i]==ch+1) d[i]=1; } auto r=tconv(as, bs, n, a, b, c, d); for (int i=psize-1;i<ssize;i++){ ma[i-psize+1]+=r.F[i]+r.S[i]; } ch+=2; } } vector<int> v; for (int i=0;i<ssize-psize+1;i++){ if (ma[i]==psize-q) v.push_back(i+1); } printf("%d\n", (int)v.size()); for (int vv:v){ printf("%d\n", vv); } }
Test details
Test 1
Verdict: ACCEPTED
input |
---|
a?b
aabb |
correct output |
---|
2 1 2 |
user output |
---|
2 1 2 |
Test 2
Verdict: ACCEPTED
input |
---|
???hj?????bcg??c????f????p???l... |
correct output |
---|
1 225711 |
user output |
---|
1 225711 |
Test 3
Verdict: ACCEPTED
input |
---|
kvioxrw?wrmrljtbkonrczszi?sxff... |
correct output |
---|
1 318678 |
user output |
---|
1 318678 |
Test 4
Verdict: ACCEPTED
input |
---|
??????????????????????????????... |
correct output |
---|
1 124684 |
user output |
---|
1 124684 |
Test 5
Verdict: ACCEPTED
input |
---|
???????????????????????b??????... |
correct output |
---|
1 162249 |
user output |
---|
1 162249 |
Test 6
Verdict: ACCEPTED
input |
---|
??????????????????????????????... |
correct output |
---|
1 61191 |
user output |
---|
1 61191 |
Test 7
Verdict: ACCEPTED
input |
---|
??????????????????????????????... |
correct output |
---|
200001 1 2 3 4 ... |
user output |
---|
200001 1 2 3 4 ... |
Test 8
Verdict: ACCEPTED
input |
---|
??????????????????????????????... |
correct output |
---|
399901 1 2 3 4 ... |
user output |
---|
399901 1 2 3 4 ... |
Test 9
Verdict: ACCEPTED
input |
---|
??????????????????????????????... |
correct output |
---|
390001 1 2 3 4 ... |
user output |
---|
390001 1 2 3 4 ... |
Test 10
Verdict: ACCEPTED
input |
---|
??????????????????????????????... |
correct output |
---|
300001 1 2 3 4 ... |
user output |
---|
300001 1 2 3 4 ... |
Test 11
Verdict: ACCEPTED
input |
---|
??????????????????????????????... |
correct output |
---|
300000 1 2 3 4 ... |
user output |
---|
300000 1 2 3 4 ... |
Test 12
Verdict: ACCEPTED
input |
---|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
correct output |
---|
390001 1 2 3 4 ... |
user output |
---|
390001 1 2 3 4 ... |