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;
}