萌新求助WA80
查看原帖
萌新求助WA80
51569
wgyhm楼主2024/1/24 16:18

只挂了 subtask2 第一个点。用之前的暴力改的,暴力过了这个包。球球老哥看一看。/kel 拍了好久没拍出来。

或者有没有路过的管理帮忙给个数据。/kel

#include<bits/stdc++.h>
#define ll long long
#define int long long
#define ull unsigned long long
#define maxn 200005
#define put() putchar('\n')
#define Tp template<typename T>
#define Ts template<typename T,typename... Ar>
using namespace std;
Tp void read(T &x){
    int f=1;x=0;char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
    while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
    x*=f;
}
namespace Debug{
	Tp void _debug(char* f,T t){cerr<<f<<'='<<t<<endl;}
	Ts void _debug(char* f,T x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);}
	#define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__)
}using namespace Debug;
#define fi first
#define se second
#define mk make_pair
const int mod=998244353;
ll power(ll x,int y=mod-2,int p=mod) {
	ll sum=1;x%=p;
	while (y) {
		if (y&1) sum=sum*x%p;
		x=x*x%p;y>>=1;
	}
	return sum;
}
int f[maxn],g[maxn];
int n,m,len;
int s[maxn],b[maxn],cnt,suf[maxn],pw[maxn],ans,nex[maxn];
void add(int &x,int y) {x=(x+y)%mod;}
struct node {
	int l,d,x;
}c[maxn];
int sum[maxn][21];
int tot;
signed main(void){
	int i,j;
	read(n);read(m);read(len);
	for (i=1;i<=len;i++) read(s[i]);
	for (j=0,i=2;i<=len;i++) {
		while (j&&s[j+1]!=s[i]) j=nex[j];
		if (s[j+1]==s[i]) j++;
		nex[i]=j;
	}
	int x=len;
	// gdb(len,nex[len]);
	while (nex[x]) x=nex[x],b[++cnt]=x;
	int las=1;
	reverse(b+1,b+1+cnt);
	for (i=2;i<=cnt;i++) {
		if (las<i&&abs(b[i]-b[i-1])==abs(b[las+1]-b[las])) ;
		else {
			++tot;
			c[tot].x=b[las];
			c[tot].l=i-las;c[tot].d=abs(b[i]-b[i-1]);
			las=i;
		}
	}
	if (las<=cnt) ++tot,c[tot].x=b[las],c[tot].l=cnt-las+1,c[tot].d=abs(b[las+1]-b[las]);
	for (i=1;i<=tot;i++) if (c[i].d==0) c[i].d=1;
	// for (i=1;i<=cnt;i++) gdb(i,b[i]);
	// for (i=1;i<=tot;i++) gdb(c[i].x,c[i].l,c[i].d);
	int res=power(m,len-1);
	int invm=power(m);
	for (pw[0]=1,i=1;i<=n;i++) pw[i]=pw[i-1]*invm%mod;
	for (i=len;i<=n;i++) {
		res=res*m%mod;
		f[i]=pw[len]*(mod+1-suf[i-len])%mod;
		for (j=1;j<=tot;j++) {
			int tmp=max(i-len+c[j].x-c[j].d,0ll);
			add(f[i],mod-(sum[i-len+c[j].x+c[j].d*(c[j].l-1)][j]-sum[tmp][j]+mod)*pw[i]%mod);
		// for (j=1;j<=cnt;j++) add(f[i],mod-f[i-len+b[j]]*pw[len-b[j]]%mod);
		}
		g[i]=f[i]*res;
		for (j=1;j<=tot;j++) sum[i][j]=(sum[i-c[j].d][j]+g[i])%mod;
		suf[i]=(suf[i-1]+f[i])%mod;
	}
	for (i=1;i<=n;i++) add(ans,f[i]);
	printf("%lld\n",ans);
	return 0;
}
//i=begin && g++ $i.cpp -o $i -std=c++14 && ./$i
2024/1/24 16:18
加载中...