当前位置: 首页 > 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.dinnco.com/news/22189.html

相关文章:

  • 做网站建设平台广州seo网络优化公司
  • 网站建设费用多少钱网络营销公司招聘
  • 免费做手机网站建设定制网站多少钱
  • 网站设计专家怎么创建一个网址
  • 成都软件定制seo培训班 有用吗
  • b2c电子商务网站源码重庆百度快速优化
  • 自己做购物网站平谷头条新闻
  • 美食美客网站建设百度搜索排名服务
  • bae搭建wordpress专业seo优化推广
  • 丽水网站建设谷歌浏览器app下载安装
  • 哪个网站做高仿衣服批发网站推广怎么做有效果
  • 网站横条广告如何制作一个简易网站
  • 菏泽做网站设计独立站怎么建站
  • b站 的网站 怎么做网络怎样做推广
  • 网站色彩心理推广联系方式
  • 广州专业网站建设报价网站建站哪家公司好
  • 做垃圾网站什么是网络营销
  • 专注高密做网站哪家强安徽百度关键词优化
  • 网站开发做什么费用百度点击软件
  • 幼教机构网站开发设计论文刚刚刚刚刚刚刚刚刚刚刚刚刚刚刚
  • 做网站 公司开展网络营销的企业
  • 外贸模板网站深圳制作网站的app
  • 请简要描述如何进行网站设计规划网站首页制作
  • discuz 做论坛与网站公司网站优化方案
  • 广州 餐饮 网站建设西安seo网站建设
  • 专做奢侈品的网站google搜索优化
  • 哈尔滨seo优化效果北京seo网站设计
  • 我想建个网站怎么建网站推广经验
  • 网站挂马教程企业网络规划设计方案
  • 工作准备区域的组成包括郑州网站优化seo