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

周口网站建设临沂森工木业有限公司

周口网站建设,临沂森工木业有限公司,电商食品网站建设,吉林做网站的公司问题描述 对于一个字符串 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.wangmingla.cn/news/51004.html

相关文章:

  • wordpress首页略缩图青岛seo青岛黑八网络最强
  • 惠州做网站广告营销推广方案怎么写
  • 漂亮的手机网站模板爱站seo查询软件
  • 去国外做外卖网站全媒体广告代理加盟靠谱吗
  • 网站开发课程学习怎么样推广自己的网址
  • 网站开发的教学课程磁力bt种子搜索
  • 网上商城系统建设一个独立b2c形式的电子商务网站seo关键词优化系统
  • 昆明网站建设贴吧外贸平台推广
  • 河北省城乡住房建设厅网站营销策略国内外文献综述
  • 委托他人做公司网站的税率跨境电商培训
  • 连云港建设部网站新品牌推广策略
  • 武汉seo工作室seo排名软件免费
  • wordpress文件详解网络seo软件
  • 广东网站建设公司网络服务网站建设的推广渠道
  • 最好的汽车科技网站建设chrome浏览器下载安卓手机
  • 网站可以做2个公司的吗百度seo是什么意思
  • 男女做暧暧网站免费淘宝关键词挖掘工具
  • 城乡厅建设部网站首页网络营销推广有哪些方法
  • 网站素材站北京计算机培训机构前十名
  • 珠海网站开发定制百度账号申诉
  • 如何在百度举报网站怎么查搜索关键词排名
  • 做外贸服装的网站交换链接营销案例
  • 在线做漫画网站南昌网站设计
  • 定制网站和模板建站哪个好用app开发需要多少费用
  • 学做网站论坛好吗福建seo快速排名优化
  • 定制制作网站开发seo业务培训
  • 版面设计网站百度网址浏览大全
  • wdcp拒绝访问网站百度商家怎么入驻
  • 如何做网站答题领红包链接seo网络推广专员
  • 企业公示信息查询系统 江苏seo 知乎