| Task: | Matching |
| Sender: | Laakeri |
| Submission time: | 2016-10-22 15:05:22 +0300 |
| Language: | C++ |
| Status: | READY |
| Result: | WRONG ANSWER |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.04 s | details |
| #2 | ACCEPTED | 3.13 s | details |
| #3 | ACCEPTED | 2.79 s | details |
| #4 | WRONG ANSWER | 6.10 s | details |
| #5 | WRONG ANSWER | 5.58 s | details |
| #6 | WRONG ANSWER | 6.97 s | details |
| #7 | WRONG ANSWER | 5.25 s | details |
| #8 | ACCEPTED | 2.00 s | details |
| #9 | ACCEPTED | 2.00 s | details |
| #10 | ACCEPTED | 2.02 s | details |
| #11 | ACCEPTED | 2.00 s | details |
| #12 | ACCEPTED | 2.90 s | details |
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 lll;
const lll mod=2097152000007340033;
const lll root=2014907510281342032;
const lll root_pw=1<<20;
lll pot(lll x, lll p) {
if (p==0) return 1;
if (p%2==0) {
x=pot(x, p/2);
return (x*x)%mod;
}
return (x*pot(x, p-1))%mod;
}
lll inv(lll x) {
return pot(x, mod-2);
}
vector<lll> fft (vector<lll> a, int d) {
lll root_1=inv(root);
int n=(int)a.size();
for (int i=1,j=0;i<n;i++) {
int bit=n>>1;
for (;j>=bit;bit>>=1) j-=bit;
j+=bit;
if (i<j) swap (a[i], a[j]);
}
for (int len=2;len<=n;len<<=1) {
lll wlen=root;
if (d==-1) wlen=root_1;
for (int i=len;i<root_pw;i<<=1) wlen=(wlen*wlen)%mod;
for (int i=0;i<n;i+=len) {
lll w = 1;
for (int j=0;j<len/2;j++) {
lll u = a[i+j];
lll v = (a[i+j+len/2]*w)%mod;
if (u+v<mod) a[i+j]=u+v;
else a[i+j]=u+v-mod;
if (u-v>=0) a[i+j+len/2]=u-v;
else a[i+j+len/2]=u-v+mod;
w=(w*wlen)%mod;
}
}
}
if (d==-1) {
lll nrev=inv(n);
for (int i=0;i<n;i++) a[i]=(a[i]*nrev)%mod;
}
return a;
}
vector<lll> conv(vector<ll> a, vector<ll> b) {
int as=a.size();
int bs=b.size();
vector<lll> aa(as);
vector<lll> bb(bs);
for (int i=0;i<as;i++) aa[i]=a[i];
for (int i=0;i<bs;i++) bb[i]=b[i];
int n=1;
while (n<as+bs-1) n*=2;
aa.resize(n*2);
bb.resize(n*2);
aa=fft(aa, 1);
bb=fft(bb, 1);
vector<lll> c(2*n);
for (int i=0;i<2*n;i++) c[i]=(aa[i]*bb[i])%mod;
c=fft(c, -1);
c.resize(as+bs-1);
return c;
}
int chv[30];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
string p,s;
cin>>p>>s;
for (int i=0;i<30;i++){
chv[i]=rand()%100000;
}
ll ev=0;
vector<ll> pv;
for (int i=0;i<(int)p.size();i++){
if (p[i]=='?') pv.push_back(0);
else {
int aa=rand()%100000;
pv.push_back(aa);
ev+=(ll)aa*(ll)chv[p[i]-'a'];
}
}
vector<ll> sv;
for (int i=0;i<(int)s.size();i++){
sv.push_back(chv[s[i]-'a']);
}
reverse(pv.begin(), pv.end());
auto r=conv(pv, sv);
vector<int> v;
for (int i=(int)p.size()-1;i<(int)s.size();i++){
if (r[i]==ev) v.push_back(i-(int)p.size()+2);
}
cout<<v.size()<<'\n';
for (int vv:v){
cout<<vv<<'\n';
}
}
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: WRONG ANSWER
| input |
|---|
| ??????????????????????????????... |
| correct output |
|---|
| 1 124684 |
| user output |
|---|
| 0 |
Test 5
Verdict: WRONG ANSWER
| input |
|---|
| ???????????????????????b??????... |
| correct output |
|---|
| 1 162249 |
| user output |
|---|
| 0 |
Test 6
Verdict: WRONG ANSWER
| input |
|---|
| ??????????????????????????????... |
| correct output |
|---|
| 1 61191 |
| user output |
|---|
| 0 |
Test 7
Verdict: WRONG ANSWER
| input |
|---|
| ??????????????????????????????... |
| correct output |
|---|
| 200001 1 2 3 4 ... |
| user output |
|---|
| 0 |
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 ... |
