corda 570C codeforce

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;
}
Publicado 54 artigos originais · ganhou elogios 0 · Vistas 1220

Acho que você gosta

Origin blog.csdn.net/weixin_44144278/article/details/100006197
Recomendado
Clasificación