破劫之战
时间限制:1秒 内存限制:128M
题目描述
世界遭受了巨大的劫难,现在只有将劫难消除,世界才能恢复和平。
小可掌握了修改这个世界的最终权限。为了方便描述这个世界的状态,小可将其表示为一个只由abcabc三个小写字母组成的字符串。对于这个世界,一段连续的abcabc即为一个劫。小可可以无限次改变每个字符,将其变成abcabc三个字母中的其中一个。但是有一股邪恶的力量也拥有了改变世界的力量,同样在修改这个世界的状态。
小可给了你这个世界最初的状态,以及qq次操作。对于每次操作,请你告诉小可还有多少个劫。
由于小可在修改这个世界的状态,邪恶的力量也在修改这个世界的状态,每次操作,劫的数量可能增加,也可能减少或者不变。所有操作结束后劫的数量不一定为00。
输入描述
第一行两个正整数n,q(1≤n,q≤105),代表字符串长度为n,有q次修改。
第二行一个字符串,只由abcabc三种字符组成。
接下来q行,每行一个正整数i(1≤i≤n)和一个字符,代表将位置i上的字符修改为c。这里默认字符串下标从1开始。
输出描述
对于每个操作,输出对于目前的状态,还有多少劫。
样例输入
9 10
abcabcabc
1 a
1 b
2 c
3 a
4 b
5 c
8 a
9 b
1 c
4 a
样例输出
3
2
2
2
1
2
1
11
1
0
提示
样例中:
操作1 a
,状态变为abcabcabc
,还有3个劫。
操作1 b
,状态变为bbcabcabc
,还有2个劫。
操作2 c
,状态变为bccabcabc
,还有2个劫。
操作3 a
,状态变为bcaabcabc
,还有2个劫。
操作4 b
,状态变为bcabbcabc
,还有1个劫。
操作5 c
,状态变为bcabccabc
,还有2个劫。
操作8 a
,状态变为bcabccaac
,还有1个劫。
操作9 b
,状态变为bcabccaab
,还有1个劫。
操作1 c
,状态变为ccabccaab
,还有1个劫。
操作4 a
,状态变为ccaaccaab
,还有0个劫。
分析:
这个题目,他实际就是让我们判断:
在操作后,有多少个连续的abc
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,q,a,disaster;
char s[N],c;
bool judge(){
if(s[a]=='a'){
if(s[a+1]=='b'&&s[a+2]=='c') return true;
return false;
}
else if(s[a]=='b'){
if(a==1) return false;
else if(s[a-1]=='a'&&s[a+1]=='c') return true;
return false;
}
else{
if(a<=2) return false;
else if(s[a-2]=='a'&&s[a-1]=='b') return true;
return false;
}
}
int main(){
scanf("%d%d",&n,&q);
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=1;i<=len-2;i++) if(s[i]=='a'&&s[i+1]=='b'&&s[i+2]=='c') disaster++;
while(q--){
scanf("%d %c",&a,&c);
bool before=judge();
s[a]=c;
bool after=judge();
if(!before&&after) disaster++;
else if(before&&!after) disaster--;
printf("%d\n",disaster);
}
return 0;
}