首页 > 其他分享 >洛谷-P8932 题解

洛谷-P8932 题解

时间:2023-01-07 20:55:59浏览次数:56  
标签:子串 字符 cnt 洛谷 leftarrow 题解 P8932 字符串 我们

正文

时间复杂度:\(\mathcal{O}(|S|+q)\)

找规律的题。

我们先来研究三组数据:

  • abcd,答案是 2;

  • aa,答案是 1;

  • ccffab,答案是 2。

以下称将一个子串按题意每个字符双倍的操作为完成

第一组数据,我们把子串 abcd 插入原字符串即可得到 \(T\),由此我们可以得知:每两个不同字母可以一次完成

第二组数据,我们把子串 aa 插入原字符串末即可得到 \(T\),由此,我们得知:多个连续相同字母可以一次完成

第三组数据是第一组、第二组数据的综合,我们截取子串 ccffab 即可,为了表达清楚,在这里先做一个定义:单个最长的由相同字母组成的子串称为一(第三组数据的块有:ccffab),然后我们就可以清晰地说明我们的发现:每两个块(或单个块)可以一次完成。第三组数据中有 4 个块,所以最快只要 \(4\div 2=2\) 次。

由上,我们设每个 \(S\) 由 \(m\) 个块组成,那么答案为 \(\left \lfloor m \div 2\right \rfloor + m\bmod 2\)。


那静态问题我们解决了,剩下的 \(q\) 次修改怎么办呢?

其实很好办的,比如我们将 aacd 的第 2 个字符修改成 c,即将原字符串变成 accd,我们可以研究一下这个字符串的块的变化:

我们设 \(a\) 为原始字符串的块数,原始字符串有 3 个块(\(a\leftarrow 3\)),修改后我们可以发现,第二个字符和它左边的字符不再构成同一个块,我们可以 \(a\leftarrow a-1\),即 C++ 中的 a--。我们继续分析,第二个字符改成了 c,和它右边的字符组成了一个块,我们可以 \(a\leftarrow a+1\),或者说 a++

设 \(x\) 为一个字符,\(S=\overline{x_1x_2x_3}\)。假设我们要修改 \(x_2\),我们可以总结出:若原来的 \(x_2\) 和左边的字符(\(x_1\))构成块,那么 \(a\leftarrow a-1\),右边的字符(\(x_3\))同理。然后,若修改后的 \(x_2\) 和左边的字符构成块,那么 \(a\leftarrow a+1\),右边也同理

这样,每次修改操作我们就可以以 \(\mathcal{O}(1)\) 解决,每次输出 \(\left \lfloor a \div 2\right \rfloor + m\bmod 2\) 就行。

代码参上:

#include<iostream>
#include<string>
using namespace std;
int q,a,cnt;
char c;
string s;
int main(){
	ios::sync_with_stdio(false),
	cin.tie(nullptr);
	cin>>q>>s;
	int k=0,d=s.size();
	s+="#";//方便后续操作,且能防止越界
	while(k<d){//指针法,k为指针,判断一个块,cnt记录s有多少块
		while(s[k+1]==s[k])	k++;
		k++,cnt++;
	}
	cout<<cnt/2+cnt%2<<'\n';
	s="#"+s;//方便后续操作,且能防止越界
	while(q--){//判断相邻的字符是否构成块且更改cnt(当前字符串块数)
		cin>>a>>c;
		if(s[a]==s[a-1])	cnt++;
		if(s[a]==s[a+1])	cnt++;
		s[a]=c;
		if(s[a]==s[a-1])	cnt--;
		if(s[a]==s[a+1])	cnt--;
		cout<<cnt/2+cnt%2<<'\n';
	}
}

完结!!

后附

日志

v1.0 on 2023.01.07: 发布

标签:子串,字符,cnt,洛谷,leftarrow,题解,P8932,字符串,我们
From: https://www.cnblogs.com/wanguan/p/17033529.html

相关文章

  • CF1007A 题解
    题目传送门题目分析贪心水题。首先将原数组从小往大排序,然后不难想到一个简单但会超时的思路,即对每个位置,向后找到一个比自己大的数进行搭配。然后是一个简单的小优化,......
  • 【NOI2019】序列 题解(贪心模拟费用流)
    (感觉是有史以来自己代码最好看的一次贪心模拟费用流。LG传送门Solution1经过一番思考,不难发现我们可以根据题面建图跑费用流。具体见下图:(从@cmd大佬那里薅来的。)然......
  • 【题解】P4632 [APIO2018] 新家
    码力底下,思维迟钝,我该怎么办?还是说这题太毒?题意给定一个\(n\)个商店,第\(i\)个商店的类型为\(t_i\),在\([a_i,b_i]\)时间营业,位于位置\(x_i\)。定义某一时刻一......
  • 题解: Luogu P8894 「UOI-R1」求和
    题目链接:link前言我的一个学长在一次比赛中出了这道题,然后,我就把这道题切了其实这道题还是比较简单的,然后我就介绍一下我的比赛时的思路和做法30分做法根据标签我......
  • USACO 2022 Cu 题解
    USACO2022Cu题解AK用时:$3$小时$30$分钟。A-CowCollege原题FarmerJohn计划为奶牛们新开办一所大学!有$N$($1\leN\le10^5$)头奶牛可能会入学。每......
  • 【题解】P6074 最小路径
    太弱小了,失去了力量和精神。思路01分数规划+长链剖分优化dp.首先求形如\(\frac{\sum\limitsa_i}{\sum\limitsb_i}\)式子的最值,首先想到二分答案\(ans\),令每个......
  • [ABC257Ex] Dice Sum 2 题解
    [ABC257Ex]DiceSum2Solution目录[ABC257Ex]DiceSum2Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面存在$n$个正六面体骰......
  • Tsawke 的十月模拟赛 题解
    Tsawke的十月模拟赛题解T1这是一道比原来的T1更像T1的妙妙性质题原题是LG-P5497[LnOI2019SP]龟速单项式变换(SMT),原题范围$10^{18}$,我感觉没意思就加强到了$10......
  • LG-P3779 [SDOI2017] 龙与地下城 题解
    LG-P3779[SDOI2017]龙与地下城Solution目录LG-P3779[SDOI2017]龙与地下城Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定一......
  • AtCoder Beginner Contest 257 题解
    AtCoderBeginnerContest257Solution目录AtCoderBeginnerContest257Solution更好的阅读体验戳此进入题面链接题面Luogu链接abc跳了[ABC257D]JumpingTakahashi......