题目大意
题解
运用自动机思想
模拟+前缀和
因为给个球都影响后面的值
所以用前缀和
code
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
const int maxn=1e6+10;
int n;
char s[maxn];
int cntl,cntw;
int posl[maxn],posw[maxn];
int l[maxn],w[maxn];
int nxt[maxn];
int main ()
{
int i,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>s[i];
cntl=0;cntw=0;
for(int i=1;i<=n;i++)
{
if(s[i]=='L') posl[++cntl]=i;
else posw[++cntw]=i;
l[i]=cntl,w[i]=cntw;
}
nxt[n]=nxt[n+1]=n+1;
for(int i=n-1;i>0;i--)
{
if(s[i]==s[i+1]) nxt[i]=i+1;
else nxt[i]=nxt[i+2];
}
int ans=0,pow=1;
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=0;j<n;)
{
int now=n+1;
if(l[j]+i<=cntl) now=min(now,posl[l[j]+i]);
if(w[j]+i<=cntw) now=min(now,posw[w[j]+i]);
if(now>n) break;
int cl=l[now]-l[j];
int cw=w[now]-w[j];
if(abs(cl-cw)==1) now=nxt[now];
if(now>n) break;
cl=l[now]-l[j],cw=w[now]-w[j];
if(cl<cw) cnt++;
j=now;
}
ans=(ans+(ll)cnt*pow)%mod;
pow=(ll)pow*(n+1)%mod;
}
cout<<ans<<endl;
return 0;
}