Nguồn đề bài: http://www.spoj.com/PTIT/problems/BCPENNY/
1. Đề bài BCPENNY spoj PTIT
Penny Game là một trò chơi đơn giản cho hai người chơi. Trò chơi này yêu cầu mỗi người chơi chọn một dãy duy nhất ba mặt đồng xu ví dụ như HEADS TAILS HEADS (HTH). Các đồng xu sẽ được tung liên tiếp cho cho đến khi xuất hiện một trong hai dãy đã được chọn lúc đầu. Người chơi nào chọn được dãy xuất hiện đầu tiên sẽ là người thắng cuộc.
Bạn hãy viết một chương trình đọc một chuỗi 40 giá trị tung đồng xu liên tiếp và xác định mỗi một chuỗi ba mặt đồng xu xuất hiện bao nhiêu lần. Hiển nhiên, ta sẽ có 8 chuỗi 3 mặt đồng xu lần lượt là: TTT, TTH, THT, THH, HTT, HTH, HHT và HHH. Các chuỗi này có thể xếp chồng lên nhau. Ví dụ ta có 40 xu liên tiếp ở mặt HEADS thì sẽ có 38 chuỗi HHH xuất hiện
Dữ liệu
Dòng đầu tiên ghi số 1 ≤ P ≤ 1000 là tổng số bộ test. Mỗi bộ test gồm 2 dòng:
- Dòng đầu tiên chứa số N là thứ tự bộ test.
- Dòng thứ hai là dãy 40 ký tự mô tả chuỗi giá trị tung đồng xu trong đó chỉ gồm hai ký tự là H và T. Không có bất cứ dấu cách nào trong các dòng dữ liệu vào.
Kết quả
Ghi ra màn hình một dòng cho mỗi bộ test trong số đầu tiên là thứ tự bộ test. Tiếp theo là 8 số cho biết số lần xuất hiện của mỗi chuỗi 3 đồng xu theo thứ tự ở trên. Mỗi số viết cách nhau một dấu cách. Sẽ có 9 dấu cách trong mỗi dòng kết quả.
Example
Input:
4
1
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
2
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
3
HHTTTHHTTTHTHHTHHTTHTTTHHHTHTTHTTHTTTHTH
4
HTHTHHHTHHHTHTHHHHTTTHTTTTTHHTTTTHTHHHHT
Output:
1 0 0 0 0 0 0 0 38
2 38 0 0 0 0 0 0 0
3 4 7 6 4 7 4 5 1
4 6 3 4 5 3 6 5 6
2. Code tham khảo BCPENNY spoj PTIT
const fi=''; type data=longint; var f:text; A:array[1..8] of data; test,i,tt:data; S:string; procedure add(s:string); begin case s of 'TTT': inc(a[1]); 'TTH': inc(a[2]); 'THT': inc(a[3]); 'THH': inc(a[4]); 'HTT': inc(a[5]); 'HTH': inc(a[6]); 'HHT': inc(a[7]); 'HHH': inc(a[8]); end; end; procedure xuli; var i,j:data; begin for i:=1 to 38 do add(s[i]+s[i+1]+s[i+2]); for i:=1 to 8 do write(a[i],' '); end; begin assign(f,fi); reset(f); readln(f,test); for i:=1 to test do begin readln(f,tt); readln(f,s); fillchar(a,sizeof(a),0); write(tt,' '); xuli; writeln; end; close(f); end.