http://codeforces.com/problemset/problem/570/C
题意:给一个字符串,然后两个连续的“.”可以变化一次,然后进行m次操作,问每次操作后可以进行如上的变换多少次。
这真的是一道很水的暴力题,但是我开始的做法真的是变态暴力,后来仔细想想之后的每次操作都可以由上一步的答案稍加推测得来。
设原来的字符串为S,进行操作的位置为pos,操作字符为op;
- 如果原来的 s[pos] 和 op相同,那么结果不变
- 如果二者不同,要把s[pos]换成op,那么讨论s[pos-1]和s[pos+1]的情况
具体的做法看代码。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[300100];
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++) scanf(" %c",&s[i]);
int cnt=0;
int ans=0;
for(int i=1;i<n;i++)
{
if(s[i]=='.'&&s[i+1]=='.') ans++;
}
while(m--)
{
int pos;
char op;
scanf("%d %c",&pos,&op);
if(s[pos]=='.' && op!='.')
{
if(pos>=1&&s[pos+1]=='.') ans--;
if(pos<=n&&s[pos-1]=='.') ans--;
}
else if(op=='.'&& s[pos]!='.')
{
if(pos>=1&&s[pos+1]=='.') ans++;
if(pos<=n&&s[pos-1]=='.') ans++;
}
s[pos]=op;
printf("%d\n",ans);
}
}
return 0;
}
我现在已经水的一无四处了,还是不能太浪…Orz。