E - Las cadenas de alimentación

E - Las cadenas de alimentación

Dadas dos cadenas a y b se define una b para ser su concatenación. Por ejemplo, si a = "abc" y b = "def", entonces una b = "abcdef". Si pensamos de concatenación como la multiplicación, exponenciación por un número entero no negativo se define de la forma habitual: a ^ 0 = "" (la cadena vacía) y un ^ (n + 1) = a * (a ^ n).

Entrada

Cada caso de prueba es una línea de entrada que representan s, una cadena de caracteres imprimibles. La longitud de s será de al menos 1 y no será superior a 1 millón de caracteres. Una línea que contiene un período sigue al último caso de prueba.

Salida

Para cada s debe imprimir el mayor n tal que s = a ^ n para alguna cadena a.

Ejemplo de entrada

abcd 
AAAA
ababab
.

Ejemplo de salida

1 
4
3

Insinuación

Este problema tiene gran entrada, el uso de scanf en lugar de cin al límite de tiempo evite superar.

Descripción Asunto:

Buscando una cadena se puede dividir en un número máximo de la misma cadena. (Completamente dividido en partes n idénticos, buscando n)

análisis:

Dependiendo de la naturaleza de la siguiente algoritmo KMP. siguiente es la misma que la longitud máxima de toda la cadena de prefijo y sufijo [strlen-1] 1. Para ciclo de cálculo, el establecimiento de d = strlen- (junto [strlen-1] 1), entonces el periodo T = strlen / d (si strlen% d == 0), de lo contrario no puede ser dividida.

Certificar la siguiente manera:

cadena Supongamos que es s [8], la longitud máxima del prefijo y el sufijo de la misma cadena entera siguiente [strlen-1] 1 es 6, d es 8-6 = 2. 2 para moverlo hacia atrás, como T [8]. Puede verse S [3] ~ S [8] y T [1] ~ T [6] es el mismo, T disponible [5] ~ T [6] == S [7] ~ S [8]. 6 desde el mismo prefijo y sufijo 6, la T [7] ~ T [8] == S [7] ~ S [8] == T [5] ~ T [6]. Por lo tanto, s se pueden dividir en ciertas partes iguales strlen / d subcadena. Si strlen% d! = 0, significa que hay un exceso, no se puede separar.

código:

 

#include <iostream> 
#include <algoritmo> 
#include <cstring> 
#include <cstdio> 
#include <sstream> 
#include <vector> 
#include <pila> 
#include <deque> 
#include <cmath> 
#include <map>
 el uso de  espacio de nombres std; 
typedef largo  largo ll;
const  int maxN = 1E6 + 6 ;
int neet [maxN];
vacío getnext ( cadena de PTR,1 ;
    int k = - 1 ;
    para ( int i = 1 ; i <len; i ++ ) 
    { 
        mientras que (k> - 1 && ptr [k + 1 !] = ptr [i]) K = neet [k];
        si (ptr [k + 1 ] == ptr [i]) k ++ ; 
        neet [i] = k; 
    } 
} 
Int main () 
{     
    mientras que ( 1 ) 
    { 
        char s [maxN]; 
        scanf ( " % s " , y S);
        Si(s [ 0 ] == ' ' && strlen (s) == 1 ) descanso ;
        int n = strlen (s); 
        getnext (s, n); int d = n- (neet [n- 1 ] + 1 );
        si (n% d == 0 ) printf ( " % d \ n " , n / d);
        más printf ( " 1 \ n " ); 
    }          Volver 0 ; 
}
        
     

 

Supongo que te gusta

Origin www.cnblogs.com/studyshare777/p/12604467.html
Recomendado
Clasificación