| Task: | Matching |
| Sender: | Laakeri |
| Submission time: | 2016-10-22 14:21:33 +0300 |
| Language: | C++ |
| Status: | READY |
| Result: | ACCEPTED |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.03 s | details |
| #2 | ACCEPTED | 0.66 s | details |
| #3 | ACCEPTED | 0.07 s | details |
| #4 | ACCEPTED | 0.11 s | details |
| #5 | ACCEPTED | 0.10 s | details |
| #6 | ACCEPTED | 0.10 s | details |
| #7 | ACCEPTED | 1.47 s | details |
| #8 | ACCEPTED | 0.18 s | details |
| #9 | ACCEPTED | 0.18 s | details |
| #10 | ACCEPTED | 0.18 s | details |
| #11 | ACCEPTED | 0.16 s | details |
| #12 | ACCEPTED | 0.77 s | details |
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[1010101];
int main(){
ios_base::sync_with_stdio(0);
string p,s;
cin>>p>>s;
int q=0;
for (int i=0;i<(int)p.size();i++) {
if (p[i]=='?') q++;
}
int chs=0;
int vs=(int)s.size()-(int)p.size()+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<(int)p.size();i++){
if (p[i]==ch) ck.push_back(i);
}
if ((ll)ck.size()*(ll)okk.size()<3e7){
chs+=(int)ck.size();
for (int o:okk){
for (int c:ck){
if (c+o>=(int)s.size()) break;
if (s[c+o]==ch){
ma[o]++;
}
}
}
ch++;
}
else{
int as=p.size();
int bs=s.size();
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<(int)p.size();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<(int)s.size();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=(int)p.size()-1;i<(int)s.size();i++){
ma[i-(int)p.size()+1]+=r.F[i]+r.S[i];
}
ch+=2;
}
}
vector<int> v;
for (int i=0;i<(int)s.size()-(int)p.size()+1;i++){
if (ma[i]==(int)p.size()-q) v.push_back(i+1);
}
cout<<v.size()<<endl;
for (int vv:v){
cout<<vv<<" ";
}
cout<<endl;
}
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 5 6 7 8 9 10 11 12 13 ... |
Test 8
Verdict: ACCEPTED
| input |
|---|
| ??????????????????????????????... |
| correct output |
|---|
| 399901 1 2 3 4 ... |
| user output |
|---|
| 399901 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
Test 9
Verdict: ACCEPTED
| input |
|---|
| ??????????????????????????????... |
| correct output |
|---|
| 390001 1 2 3 4 ... |
| user output |
|---|
| 390001 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
Test 10
Verdict: ACCEPTED
| input |
|---|
| ??????????????????????????????... |
| correct output |
|---|
| 300001 1 2 3 4 ... |
| user output |
|---|
| 300001 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
Test 11
Verdict: ACCEPTED
| input |
|---|
| ??????????????????????????????... |
| correct output |
|---|
| 300000 1 2 3 4 ... |
| user output |
|---|
| 300000 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
Test 12
Verdict: ACCEPTED
| input |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| correct output |
|---|
| 390001 1 2 3 4 ... |
| user output |
|---|
| 390001 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
