子串分值和(蓝桥杯)

写出来了,但是感觉前两年写肯定写不出来,所以做个记录~

题目描述

对于一个字符串 SS,我们定义 SS 的分值 f(S)f(S) 为 SS 中出现的不同的字符个数。例如 f("aba")=2,f("abc")=3,f("aaa")=1f("aba")=2,f("abc")=3,f("aaa")=1。

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

输入描述

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

其中,1≤n≤1051≤n≤105。

输出描述

输出一个整数表示答案。

输入输出样例

示例 1

输入

复制代码
ababc

输出

复制代码
28

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
int ans=0;//最终答案
int len=0;//字符串0~i-1中,以字符串i-1结尾的子串的分值和
//记录第一次出现的位置,和最后一次出现的位置
int sta[26],endd[26];
signed main(){
  //暴力能拿一定分
  //直接暴力
  string s;
  cin>>s;
  for(int i=0;i<26;i++){
    sta[i]=-1;
    endd[i]=-1;
  }
 
  for(int i=0;i<s.size();i++){  //i作为终点
    if(sta[s[i]-'a']==-1){ //没有出现过
    sta[s[i]-'a']=i;
    endd[s[i]-'a']=i;
     //i之前所有的数据
     len+=i+1;
     ans+=len;
    }
    else{
      len+=(i-endd[s[i]-'a']);
      ans+=len;
      endd[s[i]-'a']=i;//更新记录最后出现的位置
    }
  }
  cout<<ans<<endl;
}
相关推荐
珊瑚里的鱼几秒前
【双指针】专题:LeetCode 202题解——快乐数
开发语言·c++·笔记·算法·leetcode·职场和发展
想成为配环境大佬12 分钟前
P8739 [蓝桥杯 2020 国 C] 重复字符串
算法·蓝桥杯·贪心
A懿轩A1 小时前
2025年十六届蓝桥杯Python B组原题及代码解析
python·算法·蓝桥杯·idle·b组
wuqingshun3141592 小时前
经典算法 判断一个图是不是树
数据结构·c++·算法·蓝桥杯·深度优先
爱编程的小新☆6 小时前
2025年第十六届蓝桥杯省赛JavaB组真题回顾
算法·职场和发展·蓝桥杯
OKay_J7 小时前
蓝桥杯备赛笔记(嵌入式)
笔记·stm32·学习·蓝桥杯
天才测试猿7 小时前
接口测试之postman使用指南
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman
Wils0nEdwards11 小时前
Leetcode 独一无二的出现次数
算法·leetcode·职场和发展
Ludicrouers13 小时前
【Leetcode-Hot100】和为k的子数组
算法·leetcode·职场和发展
软件测试曦曦16 小时前
16:00开始面试,16:08就出来了,问的问题有点变态。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展