当前位置: 首页 > news >正文

周口网站建设黑河seo

周口网站建设,黑河seo,成都网站建设优惠活动,网上投诉平台问题描述 对于一个字符串 s,我们定义 s 的分值 f(s) 为 s 中恰好出现一次的字符个数。例如 f("aba")1,f("abc")3, f("aaa")0。 现在给定一个字符串 s[0..n−1](长度为 n),请你计算对于…

问题描述

对于一个字符串 s,我们定义 s 的分值 f(s) 为 s 中恰好出现一次的字符个数。例如 f("aba")=1,f("abc")=3, f("aaa")=0。

现在给定一个字符串 s[0..n−1](长度为 n),请你计算对于所有 s 的非空子串 s[i..j](0≤i≤j<n),f(s[i..j])的和是多少。

输入格式

输入一行包含一个由小写字母组成的字符串 s。

输出格式

输出一个整数表示答案。

样例输入

ababc

样例输出

21

样例说明

子串  f值
a     1
ab    2
aba   1
abab  0
ababc 1b    1ba   2bab  1babc 2a   1ab  2abc 3b  1bc 2c 1

评测用例规模与约定

对于 20% 的评测用例,1≤n≤10;

对于 40% 的评测用例,1≤n≤100;

对于 50% 的评测用例,1≤n≤1000;

对于 60% 的评测用例,1≤n≤10000;

对于所有评测用例,1≤n≤100000。

题解:

        通俗地说,题目的要求就是给定一个字符串,要求求出这个字符串所有子串的分值,而对于一个字符串来说,它的分值就等于自身包含的所有字符中出现且仅出现了一次的字符个数

        顺着题意来的话,多数人应该会想要把给定字符串的子串全部枚举出来,然后再数每个子串中只出现了一次的字符的个数,这样做需要枚举所有的左右边界,计算的时间复杂度为O(n^2),必然会超时。

        下面介绍的是O(n)的做法:

        题目要求的分值是所有子串分值的总和,并且对于相同的字母a,如果它在不同的位置,它也算是不同的字母,比如给定字符串“aba”,他有子串‘a'和‘a’,两个‘a’在不同的位置。所以我们不需要计算所有子串的分值,只需要计算每一个字母作为只出现一次的字符时,包含了该字母的子串的个数,假如说现在给定一个字符串“abcadcada”,现在讨论字母a的分值,则可以把该字符串看成“a..bc..a..dc..a..d..a”,则对于第二个字母a,它的有效子串的个数9,分别为bca,ca,a,bcad,cad,ad,bcadc,cadc,adc;其实同样也是枚举左右边界,左边界有三种选择b、c、a,右边界有三种选择a、d、c,两两组合,组合数为3*3=9。对于其它字母也是同样的计算有效子串的个数,最终求解它们的和。

      用一个数组pre[]预处理位于i左侧的和第i个字母相同的最近的一个字母的位置,“a..bc..a..dc..a..d..a”,对于第二个a来说,它是第四个字符,所以pre[4]=1;用一个数组next[]预处理位于i右侧的和第i个字母相同的最近的一个字母的位置,对于第二个a来说,next[4]=7.

        所以左边界的选择数其实就等于“a..bc..a..dc..a..d..a”中bca的长度,右边界的选择数就等于“a..bc..a..dc..a..d..a”中adc的长度,转化为代码就是i - pre[i]和next[i] - i,将两者相乘,得到第二个子串的有效子串数。

        在预处理pre和next数组时,会借助一个idx数组,由于题中给出的字符串都由小写字母组成,我们可以把每个字母都通过ascii码相减转化为数字也就是,x-'a',例如,‘b’-‘a’=1。所以idx[1]就表示上一个b出现的位置。

 结合代码:

#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10, M = 50;
int pre[N], nex[N], idx[M];int main()
{string s; cin >> s;int len = s.size();s = ' ' + s;//计算pre[i]for (int i = 1; i <= len; i++) {pre[i] = idx[s[i] - 'a'];idx[s[i] - 'a'] = i;}//初始化右超界为n+1for (int i = 0; i < 26; i++) {idx[i] = len + 1;}//计算next[i]for (int i = len; i > 0; i--) {nex[i] = idx[s[i] - 'a'];idx[s[i] - 'a'] = i;}ll ans = 0;for (int i = 1; i <= len; i++) {ans += (i - pre[i]) * (nex[i] - i);}cout << ans;return 0;
}

http://www.ds6.com.cn/news/29273.html

相关文章:

  • 上海建设交通委网站百度竞价点击价格
  • 网站配置优化贵州seo培训
  • 网站开发代码无中文google网页搜索
  • 网站建设一条龙全包营销与销售的区别
  • 会员充值网站怎么做热狗网站排名优化外包
  • 温州做网站公司哪家好seo案例模板
  • 织梦网站自己的网站怎么在百度上面推广
  • 红河学院网站建设广州优化防控措施
  • 网站刷流量有用吗软件推广赚佣金渠道
  • 南通江苏网站建设佛山网站seo
  • 苍南规划建设局网站地推的60种方法
  • 室内装修设计软件vr台州网站seo
  • 做外贸用什么社交网站推广营销方案
  • 南京房地产网站建设qq代刷网站推广
  • 房产网站制作公司交换链接营销的典型案例
  • 网站建设 上高效统筹疫情防控和经济社会发展
  • 东营信息发布平台沧州网站优化公司
  • 电商网站开发的意义seo搜索引擎优化是
  • 物流网站建设策划书怎么写优化推广公司哪家好
  • 建设网站的价值国际时事新闻最新消息
  • 网站 手机 微信 app百度秒收录神器
  • 工作一般做网站视频的工作叫做什么购买链接平台
  • 织梦网站产品长沙网络推广小公司
  • 手机网站建设选 朗创营销sem扫描电镜是测什么的
  • 做网站赌博的推广是不是犯罪的网上找客户有什么渠道
  • 惠州建设集团网站佛山网站建设排名
  • 网站建站免费南昌seo计费管理
  • 做购物网站是怎么链接银行发布信息的免费平台有哪些
  • 网站建设规划书目录医疗网站优化公司
  • 移动端公众号网站开发关键词提取工具app