蓝桥杯---子串分值和(数学)

2024-04-09 14:38
文章标签 蓝桥 数学 子串 分值

本文主要是介绍蓝桥杯---子串分值和(数学),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

试题 历届试题 子串分值和

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
对于一个字符串S ,我们定义 S 的分值 f(S) 为S 中出现的不同的字符个数。例如 f(“aba”)=2,f(“abc”)=3, f(“aaa”)=1。

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

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

输出格式
输出一个整数表示答案。

样例输入

ababc

样例输出

28

样例说明
子串 f值

a     1
ab    2
aba   2
abab  2
ababc 3b    1ba   2bab  2babc 3a   1ab  2abc 3b  1bc 2c 1

评测用例规模与约定(n为正整数)
对于 20% 的评测用例:
n<=10
对于 40%的评测用例:
n<=100
对于 60%的评测用例:
n<=1000
对于 80%的评测用例:
n<=10000
对于所有评测用例:
n<=100000
思路1:
求每个子串的字符个数,用集合处理,集合大小就是不重复字符数目;
由于至多有26中字母,所以,很长的字符串一但到达了最多字符数1,后面的就不用再一一求解了,可以减少循环次数;
code1:(80%)

#include<iostream>
#include<cstring>
#include<set>using namespace std;int main()
{long long int ans=0;char s[100005];int vis[26]={0};scanf("%s",s);int len=strlen(s);for(int i=0;i<len;i++){vis[s[i]-'a']=1;}int num=0;//num为出现的字符个数(1<=n<=26)for(int i=0;i<26;i++){if(vis[i]==1)num++;}for(int i=0;i<len;i++){set<char> e;for(int j=i;j<len;j++){e.insert(s[j]);int size=e.size();ans+=size;if(size==num){//如果当前字符全部出现了,则后面的就不用再算了ans+=(len-1-j)*size;break;}}}printf("%lld",ans);return 0;
}

思路2:
看的别人的,,,原理也没有弄懂 (^ _ ^;)
有点类似于 <蓝桥杯—子串分值>中的思想,pre存储数组中每个字符前一个相同字符出现的下标
最后求(pre[i]+1)*(len-i)的和—>sub;
然后sum =(len * (len+1) * (len+2))/ 6

对于这个sum公式,是假设len个字符各不相同的情况:
即(n+n-1+n-2+…+1)+(n-1+n-2+…+1)+…+(1)=n*(n+1)/2+n*(n-1)/2+…+1=
n*(n+1)*(n+2)/6;
(上式子可以由数学归纳法得到,属于算法数论中常用的结论吧)
最终sum - sub即为答案;
code2:

#include<iostream>
#include<cstring>
#include<set>using namespace std;int main()
{long long int ans=0;char s[100005];scanf("%s",s);long long int len=strlen(s);int now[len];int pre[len];memset(now,-1,sizeof(now));for(int i=0;i<len;i++){int index=s[i]-'a'+1;pre[i]=now[index];now[index]=i;}long long int sum=(len*(len+1)*(len+2))/6;long long int sub=0;for(int i=0;i<len;i++){sub+=(pre[i]+1)*(len-i);}ans=sum-sub;printf("%lld",ans);return 0;
}

这篇关于蓝桥杯---子串分值和(数学)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888423

相关文章

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

PHP最长单一子串

<?php//方法一$s='abcccddddddcdefg';$max='';while($s!=''){$i=0; while($i<strlen($s) && $s[$i]==$s[0]) $i++;if ($i>strlen($max)){$max=substr($s,0,$i);} $s=substr($s,$i);}echo $m

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18