QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#69286 | #2354. Ook | chenshi# | WA | 2ms | 3724kb | C++ | 2.1kb | 2022-12-26 11:22:18 | 2022-12-26 11:22:20 |
Judging History
answer
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int o=1.2e6,MOD=998244353;
inline int fix(int x){return x+(x>>31&MOD);}
inline int qp(int b,int f){int res=1;for(;f;f>>=1,b=b*1ll*b%MOD) if(f&1) res=res*1ll*b%MOD;return res;}
int O,K,n,m,sm,a[o],bt,w[o],rev[o],f[o],g[o],pre[o],ans;char s[o],p[o];
inline void init(){
w[1<<(bt-1)]=1;
for(int i=(1<<(bt-1))+1,j=qp(3,(MOD-1)/(1<<bt));i<(1<<bt);++i) w[i]=w[i-1]*1ll*j%MOD;
for(int i=(1<<(bt-1));--i;) w[i]=w[i<<1];
for(int i=1;i<(1<<bt);++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(bt-1));
}
inline void ntt(int*a,int n,bool inv){
for(int i=1;i<n;++i) if(rev[i]<i) swap(a[i],a[rev[i]]);
for(int md=1;md<n;md<<=1) for(int i=0;i<n;i+=md<<1) for(int j=0,x,y;j<md;++j)
x=a[i+j],y=a[i+j+md]*1ll*w[j+md]%MOD,a[i+j]=fix(x+y-MOD),a[i+j+md]=fix(x-y);
if(inv) for(int i=1,j=n-1;i<j;swap(a[i++],a[j--]));
}
inline void mult(){
for(int i=n;i<(1<<bt);++i) f[i]=0;
for(int i=m;i<(1<<bt);++i) g[i]=0;
ntt(f,1<<bt,0);ntt(g,1<<bt,0);
for(int i=0;i<(1<<bt);++i) f[i]=f[i]*1ll*g[i]%MOD;
ntt(f,1<<bt,1);
for(int i=0,j=qp(1<<bt,MOD-2);i<(1<<bt);++i) f[i]=f[i]*1ll*j%MOD;
}
int main(){
scanf("%d%d%s%s",&O,&K,s,p);n=strlen(s);m=strlen(p);
for(bt=1;(1<<bt)<=n+m;++bt);
init();
for(int i=0,v=0;i<n;++i) pre[i]=(v+=(s[i]=='o'?O:K));
for(int i=0;i<n;++i) if(s[i]=='o') s[i]=1;else s[i]=2;
for(int i=0;i<m;++i) if(p[i]=='o') p[i]=1;else if(p[i]=='k') p[i]=2;else p[i]=0;
for(int i=0;i<m;++i) sm+=p[i]*p[i]*!!p[i];
for(int i=0;i<n;++i) f[n-i-1]=s[i]*s[i];
for(int i=0;i<m;++i) g[i]=!!p[i];
mult();
for(int i=m-1;i<n;++i) a[n-i-1]=fix(sm+f[i]-MOD);
for(int i=0;i<n;++i) f[n-i-1]=s[i];
for(int i=0;i<m;++i) g[i]=p[i]*!!p[i];
mult();
for(int i=m-1;i<n;++i) a[n-i-1]=(a[n-i-1]+(MOD-2ll)*f[i])%MOD;
for(int i=0;i<n;ans=max(ans,f[i++])){
f[i]=0;
if(i==m-1) f[i]=max(f[i],(a[i-m+1]<=30)?pre[i]/(1<<a[i-m+1]):0);
if(i>=m-1&&!a[i-m+1]) f[i]=max(f[i],pre[i]+((i>=m)?f[i-m]-pre[i-m]:0));
if(i>=m*2-1&&!a[i-m*2+1]) f[i]=max(f[i],((a[i-m+1]<=30)?(pre[i]-pre[i-m])/(1<<a[i-m+1]):0)+f[i-m]);
}
printf("%d",ans);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3724kb
input:
2 1 ookookook koo
output:
10
result:
ok single line: '10'
Test #2:
score: 0
Accepted
time: 2ms
memory: 3488kb
input:
1 3 koooooook ?
output:
13
result:
ok single line: '13'
Test #3:
score: 0
Accepted
time: 0ms
memory: 3572kb
input:
1000 0 kookoo ook
output:
2000
result:
ok single line: '2000'
Test #4:
score: 0
Accepted
time: 2ms
memory: 3560kb
input:
21 1 ooo kkk
output:
7
result:
ok single line: '7'
Test #5:
score: 0
Accepted
time: 0ms
memory: 3592kb
input:
1 0 ookko k??ko
output:
1
result:
ok single line: '1'
Test #6:
score: -100
Wrong Answer
time: 2ms
memory: 3572kb
input:
5 8 koookokkok oo
output:
22
result:
wrong answer 1st lines differ - expected: '32', found: '22'