AcWing 2868. 子串分值(贡献法)

2024-02-21 21:04
文章标签 acwing 子串 贡献 2868 分值

本文主要是介绍AcWing 2868. 子串分值(贡献法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AcWing 2868. 子串分值

原题链接:https://www.acwing.com/problem/content/2871/

具体分析过程如下图:

直接遍历的话太麻烦,且时间复杂度太高,所以另寻他路
字符串中只有小写字母26个,所以可以从此着手, 考虑每个字母对答案的贡献度
那么枚举仅包含一个i的区间的左右端点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码如下:

#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
char s[N];
//p[t]代表t字符当前所指向的位置 t -> [0, 25]
int l[N], r[N], p[26];  //l[]i, r[i]代表位置i的字符的前后一次出现的位置
int main() {scanf("%s", s + 1); //[1, n]int n = strlen(s + 1);//给左区间赋值for(int i = 0; i < 26; i++ )   p[i] = 0;      //将第0个位置设为i字符左极值for(int i = 1; i <= n; i++ ) {l[i] = p[s[i] - 'a'];   //i位置的t字符上次出现位置给l[i]p[s[i] - 'a'] = i;  //存下t字符此次出现的位置i,以方便下次赋值给l[]}  //给右区间赋值for(int i = 0; i < 26; i++ )    p[i] = n + 1;  //当前指向n+1位置,也就是在n+1位置设置哨兵for(int i = n; i >= 1; i--) {r[i] = p[s[i] - 'a'];p[s[i] - 'a'] = i;  //存下t字符此次出现的位置i,以方便赋值给r[]}LL res = 0;for(int i = 1; i <= n; i++) {res += (LL)(i - l[i]) * (r[i] - i);}cout << res;return 0;
}

这篇关于AcWing 2868. 子串分值(贡献法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

【AcWing】851. 求最短路

spfa算法其实是对贝尔曼福特算法做一个优化。 贝尔曼福特算法会遍历所有边来更新,但是每一次迭代的话我不一定每条边都会更新,SPFA是对这个做优化。 如果说dist[b]在当前这次迭代想变小的话,那么一定是dist[a]变小了,只有a变小了,a的后继(b)才会变小。 用宽搜来做优化,用一个队列,队列里边存的就是所有变小了的结点(队列里存的是待更新的点)。 基本思路就是我更新过谁,我再拿

【UVA】10066-The Twin Towers(最长公共子串问题)

赤裸裸的最长公共子串问题,没什么好说的,注意的是,每组数据后面都有一个空行。 13996019 10066 The Twin Towers Accepted C++ 0.015 2014-08-06 00:34:53 #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using

【AcWing】852. spfa判断负环

#include<iostream>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int N= 1e5+10;int n,m;int h[N],w[N],e[N],ne[N],idx;int dist[N],cnt[N];//cnt存最短路径的边数bool st[N];v

MySQL中的`SUBSTRING()`和`MID()`函数:精准抽取字符串中的子串

在数据库操作中,经常需要从存储的字符串中提取出特定的部分,比如从用户全名中提取姓氏、从日期字符串中提取年份等。MySQL提供了SUBSTRING()和MID()两个函数,它们的功能几乎完全相同,都是用来从字符串中抽取子串的。本文将详细介绍这两个函数的用法、参数以及在实际场景中的应用。 一、SUBSTRING()和MID()函数的基本语法 1. SUBSTRING()函数 SUBSTRING(

leetcode: 5. 最长回文子串

5. 最长回文子串 题目链接https://leetcode.cn/problems/longest-palindromic-substring/ 题目描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2:

java常用算法之最长回文子串(Longest Palindromic Substring)

方法一:时间复杂度为O(n^3) public static String longestPalindrome1(String s) {int maxPalinLength = 0;String longestPalindrome = null;int length = s.length();// check all possible sub stringsfor (int i = 0; i