Niu Ke-Hiding

Niu Ke-Hiding

Descrição do título

XHRlyb e seu amiguinho Cwbc estão brincando de esconde-esconde.
Cwbc está oculto em várias strings que não diferenciam maiúsculas de minúsculas.
O curioso XHRlyb quer saber quantas vezes Cwbc aparece como uma subsequência em cada string.
Como Cwbc pode aparecer muitas vezes, você só precisa enviar o resultado de cada módulo de resposta 2000120420010122.
Depois de ler a pergunta com atenção, você será capaz de resolver esse problema sem problemas!

Insira a descrição

Os dados de entrada possuem várias linhas e cada linha possui uma sequência de caracteres.

Descrição de saída

Os dados de saída devem ter várias linhas e cada linha representa o resultado de um módulo de resposta.

Exemplo 1

digitar

Cwbc

Resultado

1

Mostra que
Cwbc aparece apenas uma vez como uma subsequência.

Exemplo 2

digitar

acdcecfwgwhwibjbkblcmcnco

Resultado

81

Mostra que
Cwbc aparece como uma subsequência 34 = 81 vezes.

Análise de tópico

Esta questão é obviamente uma questão de programação dinâmica, dp [i] [j], significa o número de j correspondido nos primeiros i caracteres, ou seja, dp [i] [1] significa que a letra 'c' corresponde ao primeiro i caracteres O número de. Então você pode listar a equação de transição de estado
dp [i] [1] = (dp [i] [1] + (s [i] == 'c'))% mod;
dp [i] [2] = (dp [i] [2] + (s [i] == 'w') * dp [i-1] [1])% mod;
(aqui multiplicando por dp [i-1] [1] é devido a'w 'O número de correspondências é determinado por' c ', e o mesmo
se aplica abaixo) dp [i] [3] = (dp [i] [3] + (s [i] ==' b ') * dp [i -1] [2])% mod;
dp [i] [4] = (dp [i] [4] + (s [i] == 'c') * dp [i-1] [3])% mod;

Mas nesta questão, a matriz bidimensional será espaçada pelo cartão, portanto, a redução da dimensionalidade é necessária. Como o estado atual está relacionado apenas ao estado anterior, a primeira dimensão pode ser excluída, que se torna:
dp [1] = (dp [1] + (s [i] == 'c'))% mod;
dp [2] = (dp [2] + (s [i] == 'w') * dp [1]) % mod;
dp [3] = (dp [3] + (s [i] == 'b') * dp [2])% mod;
dp [4] = (dp [4] + (s [i] == 'c') * dp [3])% mod;

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod = 2000120420010122;
char s[1000005];
ll dp[5];

int main(){
    while(cin >> s){
          int l = strlen(s);
          memset(dp, 0, sizeof(dp));
          for (int i = 0; i < l; i++)
              if (s[i] >= 'A' && s[i] <= 'Z')
                  s[i] = s[i] + 32;
          for (int i = 0; i < l; i++){
              if (s[i] == 'c')
                  dp[1] = (dp[1] + 1) % mod;
              else
                  dp[1] = dp[1] % mod;
              if (s[i] == 'w')
                  dp[2] = (dp[2] + 1 * dp[1]) % mod;
              else
                  dp[2] = dp[2] % mod;
              if (s[i] == 'b')
                  dp[3] = (dp[3] + 1 * dp[2]) % mod;
              else
                  dp[3] = dp[3] % mod;
              if (s[i] == 'c')
                  dp[4] = (dp[4] + 1 * dp[3]) % mod;
              else
                  dp[4] = dp[4] % mod;
        }
        cout << dp[4] << endl;  
    }


    return 0;
}

Acho que você gosta

Origin blog.csdn.net/qq_45964820/article/details/115050994
Recomendado
Clasificación