AcWing 2872. 子串分值和
原题链接
中等
作者:
-D
,
2021-03-14 20:40:33
,
所有人可见
,
阅读 511
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
typedef long long LL;
LL m[30];//26个字母分别最后一次出现的位置
LL f[N];//考虑前i个数包括第i字母时的分数和
int main()
{
string s;
cin>>s;
f[0]=1;
memset(m,-1,sizeof m);
m[s[0]-'a']=0;
for(LL i=1;i<s.size();i++)
{
if(m[s[i]-'a']==-1) f[i]=f[i-1]+1ll+i;
else f[i]=f[i-1]+i-m[s[i]-'a'];//在最后一次该字母出现之前fi和fi-1完全一样
m[s[i]-'a']=i;
}
LL ans=0;
for(int i=0;i<s.size();i++)ans+=f[i];
cout<<ans;
}