2872. 子串分值和

题目链接:https://www.acwing.com/problem/content/2875/

思路:对于每个字母 只有他在子串中第一个出现的时候才有贡献

所以考虑从1~n枚举 对于每个s[i] 计算出所有包含他的子串,且他是第一个出现的种类字母的子串数量即可

lst[i] 记录的是 i类字母上一次出现的位置, 假设 当前枚举到j  字母种类为a  那么 左端点可选情况为

j-lst[a]  右端点为n-j+1   所以两者相乘即是 该字母第一次出现的子串的数量

2872. 子串分值和
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+10;
 4 const int mod=1e9+7;
 5 #define ll long long
 6 #define ull unsigned long long
 7 #define pi pair<int,int>
 8 #define fi first
 9 #define sc second
10 #define pb push_back
11 
12 char s[maxn];
13 int lst[26];
14 
15 int main()
16 {
17     ios::sync_with_stdio(false);
18     cin.tie(0);
19     cin>>(s+1);
20     int n=strlen(s+1);
21     ll ans=0;
22     for(int i=1;i<=n;i++)
23     {
24         int x=s[i]-'a';
25         int q=i-lst[x];
26         int h=n-i+1;
27         ans+=1ll*q*h;
28         lst[x]=i;
29     }
30     cout<<ans<<'\n';
31 
32 
33 
34 }
View Code

 

上一篇:能自己“跑”的表单控件,思路,雏形,源码。vs2005版本


下一篇:python正则表达式二分组匹配