码迷,mamicode.com
首页 > 其他好文 > 详细

2872. 子串分值和

时间:2021-04-08 13:58:13      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:int   一个   ace   cout   技术   syn   http   ide   als   

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

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

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

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

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

技术图片
 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

 

2872. 子串分值和

标签:int   一个   ace   cout   技术   syn   http   ide   als   

原文地址:https://www.cnblogs.com/winfor/p/14630983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!