Số nguyên dương T được gọi là chu kỳ tuần hoàn của xâu S khác xâu rỗng nếu T nhỏ nhất và khi ghép n xâu giống nhau có độ dài T thì được xâu S. Yêu cầu: Cho trước xâu S khác xâu rỗng. Hãy xác định chu kỳ tuần hoàn của xâu S và cho biết xâu S được ghép từ bao nhiêu xâu giống nhau có độ dài T. Dữ liệu vào: Tệp CHUKY.INP gồm 1 dòng ghi xâu S khác xâu rỗng có độ dài không vượt quá 255. Dữ liệu ra: Tệp CHUKY.OUT gồm 1 dòng ghi số nguyên dương T là chu kỳ tuần hoàn của xâu S và số nguyên dương n là số xâu giống nhau có độ dài T ghép nên xâu S, hai số cách nhau đúng 1 kí tự trống. Ví dụ: CHUKY.INP CHUKY.OUT CHUKY.INP CHUKY.OUT abcabcabcabcabc 3 5 abcdef 6 1

2 câu trả lời

Số nguyên dương T được gọi là chu kỳ tuần hoàn của xâu S khác xâu rỗng nếu T nhỏ nhất và khi ghép n xâu giống nhau có độ dài T thì được xâu S. Yêu cầu: Cho trước xâu S khác xâu rỗng. Hãy xác định chu kỳ tuần hoàn của xâu S và cho biết xâu S được ghép từ bao nhiêu xâu giống nhau có độ dài T. Dữ liệu vào: Tệp CHUKY.INP gồm 1 dòng ghi xâu S khác xâu rỗng có độ dài không vượt quá 255. Dữ liệu ra: Tệp CHUKY.OUT gồm 1 dòng ghi số nguyên dương T là chu kỳ tuần hoàn của xâu S và số nguyên dương n là số xâu giống nhau có độ dài T ghép nên xâu S, hai số cách nhau đúng 1 kí tự trống.

type int = longint;
var HashT,pow:array[0..300] of int64;
    s:string;
    i,l:byte;
const md = trunc(1e9 + 7);
const base = 37;

function GetHash(i,j:int):int;
begin
    exit((HashT[j] - HashT[i-1]*pow[j-i+1] + md*md) mod md);
end;

function check(r:int):boolean;
var i,p:int;
begin
    p:=GetHash(1,r);
    i:=r;
    while (i <= l) do
        begin
            if GetHash(i-r+1,i) <> p then
                exit(false);
            inc(i,r);
        end;
    exit(true);
end;

begin
    readln(s);
    l:=length(s);
    pow[0]:=1;
    for i:=1 to l do
        pow[i]:= (pow[i-1]*base) mod md;
    for i:=1 to l do
        HashT[i]:=(HashT[i-1]*base + ord(s[i]) - 96) mod md;
    for i:=1 to l do
        if l mod i = 0 then
            if check(i) then
                begin
                    writeln(i,' ',l div i);
                    exit;
                end;
end.

Câu hỏi trong lớp Xem thêm