给出一个只含有小写字母组成的串s
sqc(s,l,r,c)表示字符c在s的[i,j]内的出现次数
这里提供DP做法。
设表示以i结尾的子区间字符串的答案。
考虑从推到
当时:
那么除了c以外的字母x
对于c来说
,
所以
即
也就是
显然我们要维护这么个东西
当从i转移到i+1时,会加上
因为的每个
都会加上i+1这个位置贡献 1,总共贡献 i
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
const int mod = 998244353;
int sum[N];//维护sqc(s,l,i,c)累加
int f[N];
void solve()
{
string s;
cin>>s;
int n=s.size();
s=" "+s;
for(int i=0;i<26;i++)
sum[i]=0;
int ans=0;
for(int i=1;i<=n;i++)
{
f[i]=(f[i-1]+2*sum[s[i]-'a']%mod+i)%mod;
ans=(ans+f[i])%mod;
sum[s[i]-'a']=(sum[s[i]-'a']+i-1+1)%mod;
}
cout<<ans<<endl;
}
signed main()
{
int tt;
cin >> tt;
// tt = 1;
while (tt--)
{
solve();
}
}