QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#69286#2354. Ookchenshi#WA 2ms3724kbC++2.1kb2022-12-26 11:22:182022-12-26 11:22:20

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-12-26 11:22:20]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:3724kb
  • [2022-12-26 11:22:18]
  • 提交

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;
}

详细

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'