Nguồn đề bài: http://www.spoj.com/PTIT/problems/P156SUME/
1. Đề bài P156SUME spoj
Một chuỗi a được gọi là ước của chuỗi b nếu tồn tại một số nguyên dương x sao cho khi ta viết x lần chuỗi a thì sẽ thu được chuỗi b. Ví dụ chuỗi “abab” có 2 ước là “ab” và “abab”.
Bạn được cho 2 cho 2 chuỗi s1 và s2, hãy đếm xem chúng có tất cả bao nhiêu ước chung?
Input
Dòng đầu tiên là 1 chuỗi s1, dòng thứ 2 là chuỗi s2.
Cả 2 chuỗi đều gồm các chữ cái thường, độ dài 2 chuỗi không quá 105.
Output
In ra một số nguyên là kết quả của bài toán.
Example
Test 1:
Input:
xyztxyzt
xyzt
Output:
1
Test 2:
Input:
aaa
aa
Output:
1
2. Hướng dẫn giải P156SUME spoj PTIT
– Gọi n1, n2 là độ dài của 2 xâu s1, s2.
– độ dài ước của xâu sẽ là [1..độ dài xâu], mà ở bài này ta cần xâu chung, như vậy ta chỉ cần xét các xâu có độ dài từ [1..min(n1,n2)]. và xâu có độ dài i có khả năng là ước của xâu khi n1 mod i=0 và n2 mod i = 0.
– Xét mỗi độ dài xâu ước, hãy kiểm tra xem xâu có độ dài i có phải là ước hay không? và kiểm tra ước trên s1, s2 giống nhau không.
– Đếm kết quả bài toán…
3. Code tham khảo P156SUME spoj PTIT
const fi=''; nmax=100000; type data=longint; var f:text; n1,n2:data; s1,s2:ansistring; procedure docfile; begin assign(f,fi); reset(f); readln(f,s1); readln(f,s2); n1:=length(s1); n2:=length(s2); close(f); end; function min(a,b:data):data; begin if a<b then exit(a); exit(b); end; procedure xuli; var i,j:data; st1,st2,x1,x2:ansistring; res:data; begin res:=0; for i:=1 to min(n1,n2) do if (n1 mod i = 0) and (n2 mod i=0) then begin st1:=copy(s1,1,i); st2:=copy(s2,1,i); if st1<>st2 then continue; x1:=''; for j:=1 to n1 div i do x1:=x1+st1; if x1<>s1 then continue; x2:=''; for j:=1 to n2 div i do x2:=x2+st2; if x2<>s2 then continue; inc(res); end; writeln(res); end; begin docfile; xuli; end.