第十一届蓝桥杯A组省赛试题 H: 子串分值(Java)

简介: 第十一届蓝桥杯A组省赛试题 H: 子串分值(Java)

试题 H: 子串分值

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分


【问题描述】

对于一个字符串 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 1

b 1

ba 2

bab 1

babc 2

a 1

ab 2

abc 3

b 1

bc 2

c 1


【评测用例规模与约定】

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

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

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

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

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


【思路】

①暴力会超时

②只有当字母出现的次数为1才有贡献度,因此我们只需要计算出每个位置的贡献度累加求和即为答案。例如ababc,如果我们求第二个位置b的贡献度,则以b为中心,向两边扩散,找到只有一个b时的最长子串,向左步长为left=1,即ababc,向右步长为right=1,即ababc,所以我们找到的子串为aba,它一共有ab,aba,b,ba 4种组合,从左到b做起点,从b到右做终点,即贡献度=(left+1)*(right+1)。


【Java代码】


import java.util.Scanner;
public class Main {
  public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  String inputString = scanner.next();
  long res = 0;
  for (int i = 0; i < inputString.length(); i++) {
    int left = 0, right = 0;
    //统计左右步长
    while(i-left > 0 && inputString.charAt(i-left-1) != inputString.charAt(i)) left++;
    while (i+right+1 < inputString.length() && inputString.charAt(i+right+1) != inputString.charAt(i)) right++;
    res += (1+left)*(1+right);
  }
  System.out.println(res);
  }
}


相关文章
|
1天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
23 6
|
1天前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
23 5
|
3月前
|
机器学习/深度学习 算法 关系型数据库
第十五届蓝桥杯C++B组省赛
第十五届蓝桥杯C++B组省赛
130 14
|
3月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
75 5
|
3月前
|
人工智能 Python
蓝桥杯练习题(四):Python组之历届试题三十题
关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
66 0
蓝桥杯练习题(四):Python组之历届试题三十题
|
7月前
|
Java
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
63 4
|
7月前
|
Java
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
44 1
|
7月前
|
存储 前端开发 算法
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
42 0
|
15天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
71 17
|
26天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者

热门文章

最新文章