Codeforces Round # 635 (Div. 2) E. Kaavi y Magic Spell

Tema: Para dar una cadena S de longitud n y una cadena T de longitud m, 1 <= m <= n, entonces hay una cadena vacía A, y luego puede realizar n operaciones en la cadena S:

Operación 1: Agregue el primer carácter de S al comienzo de A y elimínelo

Operación 2: agregue el primer carácter de S al final de A y elimínelo

Pregunta: En el proceso de operación, ¿cuántos casos hay de que los primeros m caracteres de A son T (es decir, el prefijo es T)? Diferentes longitudes o un determinado lugar en la secuencia de la operación pueden considerarse situaciones diferentes.

 

Muestra1:

Entrada:

  ABAB

  ba

Salida:

  12

Muestra2:

Entrada:

  defineintlonglong

  firmado

Salida:

  0 0

Muestra3:

Entrada:

  rotador

  rotador

Salida:

  4 4

Muestra4:

Entrada: 

  cacdcdbbbb

  bdcaccdbbb

Salida:

  24

Enlace del título original: https://codeforces.ml/contest/1337/problem/E


Después de mirar las prácticas de los mejores chicos, descubrí que se utilizó el intervalo dp.

Suponiendo que el carácter kth ha sido manipulado, significa que ya hay una cadena de longitud k-1, por lo que el carácter kth se agrega al frente o atrás de la cadena de longitud k-1 Hay un punto en el intervalo dp. Sea dp [i] [j] el número de cadenas construidas que coinciden exactamente con el carácter i-ésimo con el carácter j-ésimo de la cadena de caracteres T. Cabe señalar que podemos considerar la cadena T como la misma longitud que la cadena S, pero los caracteres en la cadena T pueden ser arbitrarios de m + 1 caracteres (porque no son parte del prefijo, por lo que puede casualmente )

 

Para la comodidad de dp, establecemos el índice inicial de la cadena en 1

Luego enumeramos S [i], la longitud del intervalo es igual al valor de i mismo, y luego interceptamos la cadena de longitud i de izquierda a derecha en la cadena T, verificamos si S [i] es el extremo izquierdo o derecho de esta cadena Cuando enumeramos a S [i], ya hemos conocido las diversas construcciones de la cadena de longitud i-1, es decir, la subcadena L + 1 ~ R de la cadena T y L ~ Sabemos cuántas subcadenas de R-1 se pueden construir con los caracteres de las primeras cadenas i-1 S. Con base en la cadena de longitud i-1, se puede insertar S [i] antes o después Después de obtener una cadena de longitud i, dp [L] [R] puede transferirse desde el estado de dp [L + 1] [R] y dp [L] [R-1].

Entonces podemos tener la siguiente ecuación de transición de estado:

 

 

Cuando la longitud del intervalo es 1, si hay caracteres iguales, habrá dp [i] [i] + = dp [i] [i-1], en este caso, en realidad es un solo carácter S [i] basado en la cadena vacía Después de la inserción previa o posterior, se convierte en una de las cadenas calificadas. De hecho, debe ser dp [i] [i] + = 1, por lo que la preprocesamos para que dp [i] [i-1] = 1 sea Si

 

El resultado final es la suma de dp [1] [m ~ n].


Código AC:

 

#include <bits / stdc ++. h>
 #define rep (i, l, r) for (long long i = l; i <= r; i ++)
 usando el  espacio de nombres std; 

typedef largo  largo ll; 
typedef pair < int , int > PII; 
typedef vector < int > VI; 
ll gcd (ll n, ll m) { return n% m == 0 ? m: mcd (m, n% m);}
 const ll M = 998244353 ; 

const  int Maxn = 3e3 + 10 ;
char S [Maxn], T [Maxn]; 
ll dp [Maxn] [Maxn]; 

En tmain () 
{ 
    ios :: sync_with_stdio ( false );
    // freopen ("data.txt", "r", stdin);
    // freopen ("output.txt", "w", stdout); 
    cin >> (S + 1 ) >> (T + 1 );
    int n = strlen (S + 1 );
    int m = strlen (T + 1 ); 

    para ( int i = 1 ; i <Maxn; i ++ ) 
        dp [i] [i - 1 ] = 1 ; 

    para ( int i = 1 , len = 1 ; i <= n; i ++, len ++)
         para ( int l = 1 , r = l + len- 1 ; r <= n; l ++, r ++ ) {
             if (l> m || S [i] == T [l]) dp [l] [r ] = (dp [l] [r] + dp [l + 1 ] [r])% M;
            si (r> m || S [i] == T [r]) dp [l] [r] = (dp [l] [r] + dp [l] [r- 1 ])% M; 
        } 

    ll ans = 0 ;
    para ( int i = m; i <= n; i ++ ) 
        ans = (ans + dp [ 1 ] [i])% M; 

    cout << ans; 

    devuelve  0 ;
}

 

Supongo que te gusta

Origin www.cnblogs.com/wulichenai/p/12710342.html
Recomendado
Clasificación