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