当前位置:网站首页>子串分值-超详细版——最后的编程挑战
子串分值-超详细版——最后的编程挑战
2022-06-29 09:23:00 【陌陌623】
H.子串分值 困难- 细心可以做出一半 不细心可以做出一点点
看了一些博客,终于是搞懂了这道题;
很多博客都说了“贡献”
我认为“贡献”是一个数x对于结果ans是有用的,并且我们可以求出有用的程度。
我们把所有对ans有用的x求出来之后,ans自然也知道了。
题解:
假如有一个字符串:ooa1ooooa2oooa3oo注:o是任意字符, a1,a2,a3是一种字符
a1能够提供贡献的字符串最长是:ooa1oooo 即:(ooa1oooo)a2oooa3oo
如果字符串中同时有a1,a2,那么a对于字符串的贡献就是0,即没有贡献
所以我们的任务是求出a1能为多少个字符串做出贡献
即多少个字符串包含a1但不能包含a2
也就是ooa1oooo 有多少个包含a1的子串?
可以用乘法算出来: l e n ( o o a 1 ) × l e n ( a 1 o o o o ) = 3 ∗ 5 = 15 len(ooa1) × len(a1oooo) = 3*5 = 15 len(ooa1)×len(a1oooo)=3∗5=15
这样就转换了问题:将所有的相同的字符 在串中的位置找到, 然后遍历一遍所有存在的字符,用上面的公式求!
但是有三个情况需要特殊处理一下:
- 字符只出现一次
- 第一次出现
- 最后一次出现
#include <iostream>
#include <vector>
using namespace std;
const int n = 100010;
typedef long long ll;
vector<int> v[n];
int main()
{
string s;
ll ans = 0, slen, l, r;
cin >> s;
slen = s.size();
// 找到所有字符 在串中的位置
// 用s[i]-'a' 目的是方便处理,没什么特殊意义
for (int i = 0; i < slen; i++)
v[s[i] - 'a'].push_back(i);
// 遍历所有可能存在的字符 'a'-'z'
// 因为已经转换了 所以是:0-25
for (int i = 0; i < 26; i++)
{
// 空的不用管
if (v[i].empty())
continue;
if (v[i].size() == 1)
{
l = v[i].front() + 1;
r = slen - v[i].front();
ans += l * r;
continue;
}
int n = v[i].size();
// 至于下面为什么+1,为什么不加1 自己在纸上模仿几次就很清楚了
// 处理端点:
// 起点
l = v[i].front() + 1;
r = v[i][1] - v[i].front();
ans += l * r;
// 终点
l = v[i].back() - v[i][n - 2];
r = slen - v[i].back();
ans += l * r;
// 处理中间节点
for (int j = 1; j < n - 1; j++)
{
l = v[i][j] - v[i][j - 1];
r = v[i][j + 1] - v[i][j];
ans += l * r;
}
}
cout << ans;
return 0;
}
边栏推荐
猜你喜欢
随机推荐
Summary of PHP memory horse technology research and killing methods
HDU 4578 Transformation(线段树+有技巧的懒标记下放)
Database common interview questions (with answers)
ImageView图片填充问题
L2-025 分而治之 (25 分)
数据库常见面试题(附答案)
Image of the basic component of the shutter
Leetcode MySQL database topic 177
Listview of the basic component of the shutter
Nacos环境隔离
RecyclerView 通用适配器封装
ImageView picture fill problem
L2-031 深入虎穴 (25 分)
Is flush stock trading software reliable and safe?
Flutter 基础组件之 Container
Flutter 基础组件之 Text
2019.10.20训练总结
nacos注册中心集群
JNI.h说明
Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8









