Substituição
TimeLimit: 2000ms MemoryLimit: 256MB
64-bit inteiro formato IO:% I64d
Problema Descrição
Daniel tem uma string s, consistindo em minúsculas letras em inglês e sinais de época (caracteres ''). Vamos definir a operação de substituição como a seguinte sequência de passos: encontrar uma substring “...” (dois períodos consecutivos) na string s, de todas as ocorrências da substring vamos escolher o primeiro, e substituir esse substring com corda “”. Em outras palavras, durante a operação de substituição, os primeiros dois períodos consecutivos são substituídos por um. Se string s não contém dois períodos consecutivos, em seguida, nada acontece.
Vamos definir f (s) como o número mínimo de operações de substituição de executar, de modo que a cadeia não tem nenhum dois períodos consecutivos esquerda.
Você precisa processo de M consultas, o i-th resulta em que o caractere na posição xi (1 ≤ xi ≤ n) de string s é atribuído valor IC. Depois de cada operação que você tem que calcular e exibir o valor de f (s).
Ajuda Daniel para processar todas as consultas.
Entrada
A primeira linha contém dois números inteiros n e m (1? N, m ≤ 300 000) o comprimento da cadeia e do número de consultas.
A segunda linha contém string s, consistindo de n minúsculas letras em inglês e sinais de época.
As seguintes linhas de m conter as descrições de procedimentos. O i-th linha contém inteiro xi e ci (1 ≤ xi ≤ n, ci - um lowercas carta Inglês ou um sinal de período), descrevendo a consulta de atribuir símbolo ci para a posição xi.
Saída
m números de impressão, um por linha, o i-ésimo destes números deve ser igual ao valor de F (s) após a realização do i-ésimo atribuição.
SampleInput 1
10 3
.b ... ... bz
1 h
3 c
9 f
SampleOutput 1
4
3
1
SampleInput 2
4 4
.cc.
2.
3.
2 um
um um
SampleOutput 2
1
3
1
1
Nota
Nota para o primeiro teste de amostra (períodos são substituídos entre parêntesis rectos).
A string original é “.B ... bz ...”.
após a primeira consulta f (hb ... bz ...) = 4 ( “hb [...] bz ...” → “hb.bz [...] ...” → “hb.bz [...].” → “hb.bz [...] ”→‘hb.bz.’)
após a segunda consulta f (hbс.bz ...) = 3 ( “hbс.bz [...] ...” → “hbс.bz [...].” → “hbс.bz [...]” → “hbс.bz.”)
após a terceira f consulta (hbс.bz ... f.) = 1 ( “hbс.bz [...] f.” → “hbс.bz.f.”)
Nota para a segunda amostra de teste.
A string original é “.cc.”.
após a primeira consulta: f (. ... c) = 1 ( "[...] c." → “.c.”)
após a segunda consulta: f (...) = 3 ( "[...] ..." → “[...].” → “[...]” → “”)
após a terceira consulta: f (.a ...) = 1 ( ".a [...]" → ‘.a’.)
após a quarta consulta: f (aa ...) = 1 ( “aa [...]” → “aa”.)
Significado das perguntas: dada uma cadeia de comprimento n e m de revisão, pedindo o número dois pontos consecutivos após cada modificação de
ideias: uma torção começou a pensar em violência após o acabamento do prêmio Eu olhei para fora do intervalo de dados TLE Eu sei que esta questão não é tão simples - - e, em seguida, através da observação pode ser encontrado apenas mudar a localização de onde os pontos de elemento (um ponto modificados em outros elementos ou outros elementos serão modificados para apontar para a resposta influente) para que Xianpao novamente gravar suas respostas, cada tempo de modificação para determinar se ele foi um impacto sobre a resposta e, em seguida, atualizar a resposta na linha de modo que você pode atualizar a resposta em tempo o (1) de
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int n,m;
ios::sync_with_stdio(false);
while(cin >> n >> m)
{
string s;
cin >> s;
int res=0;
for(int i=0;i<n;i++)
{
if(s[i]==s[i+1]&&s[i]=='.')///记录初始答案
res++;
}
while(m--)
{
int x;
char c;
cin >> x >> c;
if(s[x-1]=='.'&&s[x]=='.')res--;///如果修改的元素是点就先将答案减去
if(s[x-1]=='.'&&s[x-2]=='.')res--;
s[x-1]=c;///更新
if(s[x-1]=='.'&&s[x]=='.')res++;///更新后该位置还是点就将答案还原
if(s[x-1]=='.'&&s[x-2]=='.')res++;
cout << res << endl;
}
}
return 0;
}