点个关注呗!
2025-07-12 17:19:21
发布于:广东
18阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll p=998244353;
const ll iv2=499122177;
const ll iv4=748683265;
const ll iv6=166374059;
const ll iv8=873463809;
const ll iv12=582309206;
const int maxn=1e6+5;
int n,k,t,a[maxn];char ch;
ll f[maxn],g[maxn],x,y,z,ans;
struct nd{ll k;char ch;}s[maxn];
bool operator==(nd i,nd j){
return i.k==j.k&&i.ch==j.ch;
}
inline void add(ll &x,ll y){x+=y;if(x>=p)x-=p;}
inline void del(ll &x,ll y){x-=y;if(x<0)x+=p;}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;while(n--){
cin>>k>>ch;
if(t&&s[t].ch==ch)s[t].k+=k;
else s[++t]=(nd){k,ch};
}
for(int i=1;i<=t;i++)f[i]=(f[i-1]+s[i].k)%p;
for(int i=t;i;i--)g[i]=(g[i+1]+s[i].k)%p;
for(int i=1,c=0,r=0;i<=t;i++){
x=f[i-1];y=s[i].k%p;z=g[i+1];
add(ans,x*z%p*y%p*(y+1)%p*iv2%p);
add(ans,(x+z)*y%p*(y+1)%p*(y+1)%p*iv2%p);
del(ans,(x+z)*y%p*(y+1)%p*(2*y+1)%p*iv6%p);
add(ans,y*y%p*(y+1)%p*(2*y+1)%p*iv12%p);
add(ans,y*(y+1)%p*(y+1)%p*iv4%p);
del(ans,y*y%p*(y+1)%p*(y+1)%p*iv8%p);
a[i]=i<r?min(r-i,a[2*c-i]):0;
while(i>a[i]&&i+a[i]<=t&&s[i-a[i]]==s[i+a[i]])a[i]++;
if(i+a[i]>r)c=i,r=i+a[i];y=f[i-1]-f[i-a[i]];
if(i>a[i]&&i+a[i]<=t&&s[i-a[i]].ch==s[i+a[i]].ch)
y+=min(s[i-a[i]].k,s[i+a[i]].k);
y=(y%p+p)%p;add(ans,y*(x+1)%p*(z+1)%p);
del(ans,y*(y+1)%p*iv2%p*(x+z+2)%p);
add(ans,y*(y+1)%p*(2*y+1)%p*iv6%p);
}
cout<<ans;return 0;
}
这里空空如也
有帮助,赞一个