P8932 [JRKSJ R7] Clock Paradox 题解
__11jiang08__ · · 题解
题意
给定一个字符串
题目希望你求出初始的
思路
我们定义
不难看出,每次操作可以使
总结一下,
然后来考虑修改,先预处理
- 如果
p_i 和p_i-1 本来不同,但修改后相同了,那么段数减1 。 - 如果
p_i 和p_i+1 本来不同,但修改后相同了,那么段数减1 。 - 如果
p_i 和p_i-1 本来相同,但修改后不同了,那么段数加1 。 - 如果
p_i 和p_i+1 本来相同,但修改后不同了,那么段数加1 。
这样可以做到
还要注意,用 cin 和 cout 输入输出会超时,要用 scanf 和 printf。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
int q,cnt,len;
char s[3000009];
void solve(){
len=1;
cnt=1;
while(s[len]>='a'&&s[len]<='z'){
if(s[len]!=s[len-1]) cnt++;
len++;
}
len--;
return ;
}
void change(int pos,char c){
if(pos==0){
if(s[0]!=s[1]&&c==s[1]) cnt--;
if(s[0]==s[1]&&c!=s[1]) cnt++;
}
else if(pos==len){
if(s[pos]!=s[pos-1]&&c==s[pos-1]) cnt--;
if(s[pos]==s[pos-1]&&c!=s[pos-1]) cnt++;
}
else{
if(s[pos]!=s[pos-1]&&s[pos]!=s[pos+1]&&c==s[pos-1]&&c==s[pos+1]) cnt-=2;
if(s[pos]==s[pos-1]&&s[pos]==s[pos+1]&&c!=s[pos-1]&&c!=s[pos+1]) cnt+=2;
if(s[pos]!=s[pos-1]&&s[pos]!=s[pos+1]&&c==s[pos-1]&&c!=s[pos+1]) cnt-=1;
if(s[pos]!=s[pos-1]&&s[pos]!=s[pos+1]&&c!=s[pos-1]&&c==s[pos+1]) cnt-=1;
if(s[pos]==s[pos-1]&&s[pos]!=s[pos+1]&&c!=s[pos-1]&&c!=s[pos+1]) cnt+=1;
if(s[pos]!=s[pos-1]&&s[pos]==s[pos+1]&&c!=s[pos-1]&&c!=s[pos+1]) cnt+=1;
}
s[pos]=c;
return ;
}
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline void write(ll x)
{
if (x<0){putchar('-'); x = -x;}
if (x>9)write(x / 10);
putchar(x % 10 + '0');
}
int main(){
q=read();
scanf("%s",&s);
solve();
write((cnt+1)/2);
putchar('\n');
for(int i=1;i<=q;i++){
int p;
char c,tmp;
p=read(),c=getchar(),tmp=getchar();
change(p-1,c);
write((cnt+1)/2);
putchar('\n');
}
return 0;
}