Professional Documents
Culture Documents
Ghi chú: Thí sinh phải đặt tên file bài làm, file Input, file Output theo quy định như trên.
Câu 1: Chữ số thứ N.
Khi viết các số tự nhiên tăng dần từ 1, 2, 3,… liên tiếp nhau, ta nhận được một dãy các chữ số thập
phân vô hạn, đoạn đầu tiên của dãy sẽ là: 1234567891011121314151617181920...
Yêu cầu: Hãy tìm chữ số thứ N của dãy số vô hạn trên.
Dữ liệu: Cho trong file NUMBER.INP gồm một nguyên dương N (N < 106).
Kết quả: Ghi kết quả ra file NUMBER.OUT.
Ví dụ:
NUMBER.OUT NUMBER.OUT Giải thích kết quả
21 5 Chữ số thứ 21 trong dãy là chữ số 5
Yêu cầu: Cho số tự nhiên n. Hãy tính số lượng số hạng là số lẻ trên dòng thứ n của tam giác Pascal.
Dữ liệu: Cho trong file PASCAL.INP cấu trúc như sau: dòng đầu là số nguyên k < 10 là số lượng số n,
k dòng tiếp theo mỗi dòng ghi một số n (1< n < 2.109)
Kết quả: Ghi ra file PASCAL.OUT k dòng, mỗi dòng một số nguyên là kết quả bài toán tương ứng với
một số n trong file dữ liệu theo đúng thứ tự.
Ví dụ:
PASCAL.INP PASCAL.OUT
3 4
3 2
8 8
11
Chú ý: Trong 40 % số test có n < 30; trong 70% số test có n < 5000.
-----------------------------Hết--------------------------
Họ và tên thí sinh :....................................................... ……………..Số báo danh .............................
Bài 1:
Const fi ='number.inp';
fo ='number.out';
cs:array[1..8] of longint = (9, 180, 2700, 36000, 450000, 5400000, 63000000, 720000000);
Var n : longint;
f,g :text;
Function num(n:longint):char;
var k, so, mu : longint;
s : string;
Begin
k:=1; mu:=1;
while (k<9)and(cs[k]<n) do
begin
n:=n-cs[k];
inc(k); mu:=mu*10;
end;
if mu=1 then so:=n div k
else so:=n div k+mu+ord(n mod k>0)-1;
str(so,s);s:=s[k]+s;
num:=s[n mod k+1];
End;
BEGIN
assign(f,fi); reset(f);
assign(g,fo); rewrite(g);
while not seekeof(f) do
begin
readln(f,n);
writeln(g,num(n));
end;
close(f);
close(g);
END.
Bài 2:
const fi = 'Gombi.Inp';
fo = 'Gombi.Out';
nmax =10000;
var cha,u,v:array[1..nmax]of longint;
n,m:longint;
procedure nhap;
var f:text;
i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n,m);
for i:=1 to m do
readln(f,u[i],v[i]);
close(f);
for i:=1 to n do cha[i]:=-1;
end;
procedure Join(u,v:longint);
begin
While cha[u]>0 do u:=cha[u];
While cha[v]>0 do v:=cha[v];
if u = v then exit;
if cha[u]<cha[v] then
begin
cha[u]:=cha[u]+cha[v];
cha[v]:=u;
end
else
begin
cha[v]:=cha[v]+cha[u];
cha[u]:=v;
end;
end;
procedure xuly;
var i,j,max:longint;
f:text;
begin
for i:=1 to m do Join(u[i],v[i]);
max:=0;
for i:=1 to n do if cha[i]<max then max:=cha[i];
assign(f,fo);
rewrite(f);
write(f,-max);
close(f);
end;
begin
nhap;
xuly;
end.
Bài 3:
const fi='Triangle.inp';
fo='Triangle.out';
max=1500;
type td=record
x,y:int64;
end;
mang=array[1..max+1] of extended;
var f,g:text;
a:array[1..max+1] of td;
kc:mang;
n,d:integer;
tong:extended;
procedure doc;
var i:integer;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do
readln(f,a[i].x,a[i].y);
close(f);
end;
function truoc(t1,t2:td):boolean;
begin
truoc:=true;
if t1.y<t2.y then exit;
if (t1.y=t2.y) and (t1.x<t2.x) then exit;
truoc:=false;
end;
procedure xeptoado(l,r:integer);
var dau,cuoi:integer;
chot,tg:td;
begin
dau:=l; cuoi:=r;
chot:=a[(l+r) div 2];
repeat
while truoc(a[dau],chot)=true do dau:=dau+1;
while truoc(chot,a[cuoi])=true do cuoi:=cuoi-1;
if dau<=cuoi then
begin
tg:=a[dau];
a[dau]:=a[cuoi];
a[cuoi]:=tg;
inc(dau);
dec(cuoi);
end;
until dau>cuoi;
if l<cuoi then xeptoado(l,cuoi);
if dau<r then xeptoado(dau,r);
end;
procedure qsort(l,r:integer);
var dau,cuoi:integer;
chot,tg:extended;
begin
dau:=l; cuoi:=r;
chot:=kc[(l+r) div 2];
repeat
while kc[dau]<chot do dau:=dau+1;
while chot<kc[cuoi] do cuoi:=cuoi-1;
if dau<=cuoi then
begin
tg:=kc[dau];
kc[dau]:=kc[cuoi];
kc[cuoi]:=tg;
dau:=dau+1;
cuoi:=cuoi-1;
end;
until dau>cuoi;
if l<cuoi then qsort(l,cuoi);
if dau<r then qsort(dau,r);
end;
function dd(a,b:td):extended;
begin
dd:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
end;
procedure tinh(kc:mang);
var buoc,run:integer;
begin
buoc:=1; run:=1;
while buoc<n do
begin
inc(buoc);
if kc[buoc]=kc[buoc-1] then inc(run) else
if run>1 then
begin
tong:=tong+(run*(run-1) div 2);
run:=1;
end;
end;
fillchar(kc,sizeof(kc),0);
end;
procedure xuli;
var i,j:integer;
m:extended;
begin
for i:=1 to n do
begin
d:=0;
for j:=1 to n do
begin
m:=dd(a[i],a[j]);
if m>0 then
begin
inc(d);
kc[d]:=m;
end;
end;
if d>1 then
begin
qsort(1,d);
tinh(kc);
end;
end;
end;
procedure loaitru;
var i,j,l,r,m,d,c,u:integer;
look:td;
nb:boolean;
begin
for i:=1 to n do
for j:=i+1 to n do
begin
if ((a[i].x+a[j].x) mod 2=0) and ((a[i].y+a[j].y) mod 2=0) then
begin
look.x:=(a[i].x+a[j].x) div 2;
look.y:=(a[i].y+a[j].y) div 2;
l:=1; r:=n;
while l<=r do
begin
m:=(l+r) div 2;
if (a[m].y>look.y) or ((a[m].y=look.y) and (a[m].x>look.x))
then r:=m-1 else
if (a[m].y<look.y) or ((a[m].y=look.y) and (a[m].x<look.x))
then l:=m+1 else
if (a[m].x=look.x) and (a[m].y=look.y) then
begin
tong:=tong-1;
break;
end;
end;
end;
end;
end;
Begin
doc;
xeptoado(1,n);
tong:=0;
assign(g,fo); rewrite(g);
xuli;
loaitru;
writeln(g,tong:0:0);
close(g);
End.
Bài 4:
const fi = 'pascal.inp';
fo = 'pascal.out';
var n:longint;
i,sobit:byte;
f,g:text;
begin
assign(f,fi);
reset(f);
assign(g,fo);
rewrite(g);
read(f,n);
sobit:=0;
for i:=0 to 31 do
if (1 shl i)and n <>0 then inc(sobit);
write(g,1 shl sobit);
close(f);
close(g);
end.
SỞ GD&ĐT NINH BÌNH ĐỀ THI CHỌN HỌC SINH GIỎI LỚP 12 THPT
Kỳ thi thứ nhất - Năm học 2012 – 2013
ĐỀ THI CHÍNH THỨC MÔN: TIN HỌC
Ngày thi: 10/10/2012
(Thời gian làm bài: 180 phút)
Đề thi gồm 04 câu, trong 02 trang
Tổng quan đề thi:
Câu Tên file bài làm Tên file Input Tên file Otput Thời gian chạy
1 TOUR.PAS TOUR.INP TOUR.OUT 1 giây/test
2 HAIVAN.PAS HAIVAN.INP HAIVAN.OUT 1 giây/test
3 FROG.PAS FROG.INP FROG.OUT 1 giây/test
4 EC.PAS EC.INP EC.OUT 1 giây/test
Câu 1: Thăm quan.
Có N đoàn khách du lịch được đánh số từ 1 đến N đang chờ Công ty du lịch Ninh Bình đưa đi
thăm quan theo hợp đồng. Đoàn thứ i sẽ đi tới thăm quan ở địa điểm cách trụ sở Công ty di km. Công
ty có M xe khách (N≤ M) đánh số từ 1 tới M, xe thứ j có mức tiêu thụ xăng là vj lít/km.
Yêu cầu: Hãy chọn N xe và bố trí để đưa các đoàn đến địa điểm thăm quan, mỗi xe chỉ phục vụ một
đoàn, sao cho tổng lượng xăng cần phải sử dụng là ít nhất.
Dữ liệu: Cho trong file TOUR.INP
Dòng 1 chứa hai số nguyên N, M ( N≤ M ≤ 500).
Dòng 2 chứa N số nguyên dương d 1, d 2,..., d N (di < 10 4).
Dòng 3 chứa M số nguyên dương v1, v2, ..., vM (vi < 104).
Kết quả: Ghi ra file TOUR.OUT một số nguyên là lượng xăng ít nhất cần cung cấp cho các xe.
Ví dụ:
TOUR.INP TOUR.OUT
34 256
759
17 13 15 10
Câu 2: An toàn đường hầm Hải Vân.
Hầm đèo Hải Vân nối liền hai địa danh nổi tiếng miền trung Việt Nam là Huế và Đà Nẵng. Theo
quy định, xe ô tô đi trong đường hầm không được vượt nhau. Đầu năm 2012 (là năm an toàn giao
thông), ban quản lý đã đặt camera theo dõi xe ô tô vào và ra đường hầm. Có N xe ô tô đánh số từ 1 tới
N được camera ghi nhận đi vào đường hầm (bên địa phận Huế) và ra khỏi đường hầm (bên địa phận
Đà Nẵng).
Yêu cầu: Dựa vào thứ tự các xe vào và ra khỏi đường hầm, xác định số lượng xe ra đường hầm không
đúng thứ tự như khi đi vào và số lượng những xe chắc chắn đã vượt xe khác trong đường hầm.
Dữ liệu: Cho trong file HAIVAN.INP:
Dòng 1 chứa số nguyên N ( N ≤ 10 5).
Dòng 2 chứa N số lần lượt là chỉ số các xe theo thứ tự đi vào đường hầm.
Dòng 3 chứa N số lần lượt là chỉ số các xe theo thứ tự đi ra khỏi đường hầm.
Kết quả:Ghi ra file HAIVAN.OUT trên 02 dòng:
Dòng 1 chứa số nguyên K - số xe đi ra không đúng thứ tự như khi vào đường hầm.
Dòng 2 chứa số nguyên M - số xe đã vượt xe khác trong hầm.
Nếu không có xe nào phạm luật thì mỗi dòng ghi một số 0.
Ví dụ:
HAIVAN.INP HAIVAN.OUT Giải thích
5 4 Xe 2, 3, 4, 5 ra không đúng thứ tự
12345 3 Xe 3, 4, 5 đã vượt xe 2
14532
Chú ý: Trong 60% số test có n < 200; Trong mỗi test, chỉ làm đúng 1phần vẫn được cho điểm phần
đó.
Câu 3: Chú ếch.
Chú ếch con phải giải quyết một chuyện phức tạp: có một hàng N lá bông súng trên mặt nước
đánh số từ 1 đến N từ trái qua phải (2 ≤ N ≤ 105), khi chú ếch đang ngồi ở lá thứ m mỗi bước chú có
thể nhảy sang một trong k lá bông súng khác có thứ tự là m + pi (i = 1, 2,..,k; k ≤ 1000). Chú ếch của
chúng ta ban đầu ở lá a và cần di chuyển trên các lá bông súng để đến bắt con ruồi ở lá b (1 ≤ a, b ≤
N, a ≠ b).
Yêu cầu: Cho n, a, b và các bước nhảy ếch có thể thực hiện. Hãy chỉ ra số bước nhảy ít nhất để ếch đến
bắt được ruồi tại lá b.
Dữ liệu: Cho trong file FROG.INP:
Dòng 1 chứa 4 số nguyên N, k, a và b.
Trên k dòng sau mỗi dòng là một số nguyên pi (|pi| < N).
Kết quả: Ghi ra file FROG.OUT số bước nhảy ít nhất tìm được. Nếu không có cách nhảy ghi -1.
Ví dụ:
FROG.INP FROG.OUT
5223 2
2
-1
Chú ý: Trong 60% số test có n < 30.
Bài 4: Ép cọc.
Một công trình xây dựng đang cần thi công việc ép N chiếc cọc. Người ta sử dụng một chiếc máy
ép cọc. Mỗi lần sử dụng, máy có thể ép được những cọc thuộc hình tròn bán kính R, tâm là vị trí máy.
Giả thiết rằng khu vực thi công nằm trong hệ trục Oxy và máy chỉ được đặt trên trục Ox tại các điểm
có tọa độ nguyên. Do mỗi lần vận hành máy rất vất vả tốn kém nên các thợ máy muốn xác định số lần
ép cọc ít nhất có thể.
Yêu cầu: Cho biết tọa độ của N chiếc cọc, hãy xác định số lần sử dụng máy ít nhất có thể ép được tất
cả N cọc.
Dữ liệu: Cho trong file EC.INP:
Dòng 1 chứa 2 số nguyên dương N và R. (N≤105, R ≤103).
Trong N dòng tiếp theo, mỗi dòng chứa 2 số nguyên xi và yi thể hiện tọa độ cọc thứ i
( 0 ≤xi ≤10 9 ; | yi| ≤ R).
Kết quả: Ghi ra file EC.OUT một số nguyên là số lần ép cọc ít nhất tìm được.
Ví dụ:
EC.INP EC.OUT
4 3 2
2 2
4 -2
7 2
8 1
Chú ý: Trong 60% số test tất cả các cọc thẳng hàng và đều nằm trên trục Ox với n ≤ 1000, R ≤ 100,
các tọa độ nhỏ hơn 104.
-----------------------------Hết--------------------------
Họ và tên thí sinh :....................................................... ……………..Số báo danh .............................
Họ và tên, chữ ký: Giám thị 1:......................................................................................................
Giám thị 2:.......................................................................................................
HƯỚNG DẪN CHẤM THI CHỌN HỌC SINH GIỎI LỚP 12 THPT
Kỳ thi thứ nhất - Năm học 2012 – 2013
MÔN: TIN HỌC
Chấm bằng chương trình tự động AMM2:
Câu 1: 10 test, mỗi test đúng cho 0,5 điểm.
Câu2: 10 test, mỗi test đúng cho 0,5 điểm.
Câu3: 10 test, mỗi test đúng cho 0,5 điểm.
Câu 4: 10 test, mỗi test đúng cho 0,5 điểm.
Bài 1
const
finp = 'TOUR.INP';
fout = 'TOUR.OUT';
var
n, m: Integer;
Val, Pos: array[1..2, 1..8000] of Integer;
{=================================================}
procedure ReadInput;
var
i: Integer;
hf: Text;
begin
Assign(hf, finp);
Reset(hf);
Readln(hf, n, m);
for i := 1 to n do Read(hf, Val[1, i]);
Readln(hf);
for i := 1 to m do Read(hf, Val[2, i]);
Close(hf);
for i := 1 to m do
begin
Pos[1, i] := i;
Pos[2, i] := i;
end;
end;
{=================================================}
procedure QuickSort(t, l, r: Integer);
var
x, tg, i, j: Integer;
begin
x := Val[t, (l + r) div 2];
i := l; j := r;
repeat
while Val[t, i] < x do Inc(i);
while Val[t, j] > x do Dec(j);
if i <= j then
begin
Tg := Val[t, i]; Val[t, i] := Val[t, j]; Val[t, j] := Tg;
Tg := Pos[t, i]; Pos[t, i] := Pos[t, j]; Pos[t, j] := Tg;
Inc(i); Dec(j);
end;
until i > j;
if i < r then QuickSort(t, i, r);
if j > l then QuickSort(t, l, j);
end;
{=================================================}
procedure WriteOutput;
var
i: Integer;
Sum: LongInt;
hf: Text;
begin
Sum := 0;
for i := 1 to n do Inc(Sum, Val[1, n - i + 1] * Val[2, i]);
for i := 1 to n do Val[1, Pos[1, n - i + 1]] := Pos[2, i];
Assign(hf, fout);
Rewrite(hf);
Writeln(hf, Sum);
for i := 1 to n do Writeln(hf, Val[1, i]);
Close(hf);
end;
begin
ReadInput;
QuickSort(1, 1, n);
QuickSort(2, 1, m);
WriteOutput;
end.
Bài 2:
const fi = 'HAIVAN.INP';
fo = 'HAIVAN.OUT';
nmax = 100005;
Var v,r:array[1..nmax] of longint;
vipham:array[1..nmax]of boolean;
n,k,m:longint;
procedure nhap;
var f:text;
i,j:longint;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do read(f,v[i]);
readln(f);
for j:=1 to n do read(f,r[j]);
close(f);
end;
procedure xuly;
Var i,j:longint;
f:text;
begin
k:=0;
for i:=1 to n do
if v[i]<>r[i] then inc(k);
fillchar(vipham,sizeof(vipham),false);
m:=0;
j:=0;
for i:=1 to n do
if vipham[v[i]]=false then
Repeat
inc(j);
if r[j]<>v[i] then
begin
inc(m);
vipham[r[j]]:=true;
end;
Until r[j] = v[i];
assign(f,fo);
rewrite(f);
writeln(f,k);
writeln(f,m);
close(f);
end;
Begin
nhap;
xuly;
end.
Bài 3:
const fi='frog.inp';
fo='frog.out';
var f:text;
n,k,a,b:longint;
p:array[1..100000]of longint;
hd,truoc,d:array[1..100000]of longint;
dau:array[1..100000]of boolean;
procedure nhap;
var i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n,k,a,b);
for i:=1 to k do
readln(f,p[i]);
close(f);
end;
procedure chuanbi;
begin
fillchar(truoc,sizeof(truoc),0);
fillchar(dau,sizeof(dau),false);
dau[a]:=true;
end;
procedure xuli;
var i,d,c,u,s:longint;
begin
d:=1;
c:=1;
hd[1]:=a; d[a]:=0;
while d<=c do
begin
u:=hd[d];
inc(d);
for i:=1 to k do
if (u+p[i]>0) and (u+p[i]<=n) then
begin
s:=u+p[i];
if dau[s]=false then
begin
inc(c);
hd[c]:=s;
truoc[s]:=u;
d[s]:=d[u]+1;
dau[s]:=true;
end;
if dau[b]=true then exit;
end;
end;
end;
procedure inkq;
var sl,u:longint;
begin
assign(f,fo);
rewrite(f);
if dau[b]=false then writeln(f,-1)
else
writeln(f,d[b]);
close(f);
end;
BEGIN
nhap;
chuanbi;
xuli;
inkq;
END.
Bài 4
const fi = 'EC.INP';
fo = 'EC.OUT';
nmax = 100005;
Type diem = record
x,y:longint;
end;
var n,R,kq:longint;
A,D:array[1..nmax] of diem;
procedure nhap;
var f:text;
i,j:longint;
begin
assign(f,fi);
reset(f);
readln(f,n,r);
for i:=1 to n do readln(f,a[i].x,a[i].y);
close(f);
end;
procedure chuanbi;
var i:longint;
le,ri:real;
begin
for i:=1 to n do
begin
le:=a[i].x - sqrt(sqr(r)-sqr(a[i].y));
ri:=a[i].x + sqrt(sqr(r)-sqr(a[i].y));
if le <=0 then d[i].x:=0 else d[i].x:=trunc(le);
d[i].y:=trunc(ri);
end;
end;
procedure Sort(l,r:longint);
var i,j:longint;
k:longint;
tg:diem;
Begin
if l>=r then exit;
i:=l; j:=r;
k:=d[l+random(r-l+1)].y;
Repeat
while d[i].y<k do inc(i);
While d[j].y>k do dec(j);
if i<=j then
begin
tg:=d[i]; d[j]:=d[j]; d[j]:=tg;
inc(i);
dec(j);
end;
Until i>j;
Sort(l,j);
Sort(i,r);
end;
procedure xuly;
var diemcuoi,i:longint;
f:text;
begin
diemcuoi:=-1;
kq:=0;
For i:=1 to n do
if d[i].x>diemcuoi then
begin
inc(kq);
diemcuoi:= d[i].y;
end;
assign(f,fo);
rewrite(f);
write(f,kq);
close(f);
end;
begin
nhap;
chuanbi;
Sort(1,n);
Xuly;
end.
SỞ GIÁO DỤC VÀ ĐÀO TẠO KỲ THI CHỌN ĐỘI TUYỂN DỰ THI
HÀ TĨNH HỌC SINH GIỎI QUỐC GIA LỚP 12 THPT
NĂM HỌC 2012-2013
ĐỀ THI CHÍNH THỨC MÔN THI: TIN HỌC - Vòng 2
(Đề thi có 02 trang, gồm 03 bài) Thời gian: 180 phút (không kể thời gian giao đề)
Ngày thi thứ hai: 22/09/2012
Tên bài File chương trình File dữ liệu vào File kết quả
Bài 1 Từ chuẩn TUCHUAN.PAS TUCHUAN.INP TUCHUAN.OUT
Bài 2 Tìm mật khẩu PASSWROD.PAS PASSWROD.INP PASSWROD.OUT
Bài 3 Quà Tết Trung thu TIMQUA.PAS TIMQUA.INP TIMQUA.OUT
Hãy sử dụng ngôn ngữ lập trình pascal hoặc free pascal lập trình giải các bái toán sau:
Trang 1
/3
tố tạo được từ các xâu con của T (xâu con của một xâu ký tự T là một chuỗi liên tiếp các ký tự
trong T).
Ví dụ: xâu T= “timpassword232432fsdgd45435dsfdsf” chứa mật khẩu là 43 vì T chứa các xâu
con ứng với các số nguyên tố 2, 3, 23, 43, và 5.
Yêu cầu: Cho một xâu ký tự T chiều dài không quá 250 ký tự. Tìm mật khẩu P đã dấu trong
xâu T biết P có giá trị nhỏ hơn 105. Dữ liệu cho đảm bảo T chứa ít nhất 1 số nguyên tố.
Dữ liệu: Vào từ file văn bản PASSWORD.INP gồm 1 dòng duy nhất là xâu T.
Kết quả: Ghi ra file văn bản PASSWORD.OUT chứa số P tìm được.
Ví dụ:
PASSWORD.INP PASSWORD.OUT
timpassword232432fsdgd45435dsfdsf 43
Trang 2
/3
Họ và tên thí sinh……………………………………………..Số báo danh……………………..
SỞ GIÁO DỤC VÀ ĐÀO TẠO KỲ THI CHỌN ĐỘI TUYỂN DỰ THI
HÀ TĨNH HỌC SINH GIỎI QUỐC GIA LỚP 12 THPT
NĂM HỌC 2012-2013
Tên bài File chương trình File dữ liệu vào File kết quả
Bài 1 Từ chuẩn TUCHUAN.PAS TUCHUAN.INP TUCHUAN.OUT
Bài 2 Tìm mật khẩu PASSWROD.PA PASSWROD.IN PASSWROD.OU
Bài 3 Quà Tết Trung thu TIMQUA.PAS TIMQUA.INP TIMQUA.OUT
Tất cả các bài đều chấm bằng bộ test, mỗi bộ test đúng được một điểm. Nếu không chạy được chương
trình thì căn cứ vào bài làm của học sinh để cho điểm nhưng tối đa không quá 2 điểm trên bài.
- Bài 1: 6 test 6 điểm.
- Bài 2: 7 test 7 điểm.
- Bài 3: 7 test 7 điểm.
Hướng dẫn chương trình tham khảo
Bài 1. (6 điểm) Từ chuẩn
Ta dùng mảng v[1..n] để lưu từ cần tìm. Tại mỗi bước i ta xác định giá trị v[i] trong khoảng 1..m
sao cho v[1..i] là từ chuẩn.
Điều kiện P: v[1..i] là từ chuẩn.
Điều kiện Q: Dừng thuật toán theo một trong hai tình huống sau đây:
nếu i = n thì bài toán có nghiệm v[1..n].
nếu i = 0 thì bài toán vô nghiệm.
TimTu1: Tìm một nghiệm.
Hàm Tim hoạt động như sau: duyệt các giá trị tại vị trí v[i] của từ v[1..i] kể từ v[i] + 1 đến m
sao cho v[1..i] là từ chuẩn.
Tim = true nếu tồn tại một giá trị v[i] như vậy. Ngược lại, nếu với mọi v[i] = v[i] + 1..m từ
v[1..i] đều không chuẩn thì Tim = false.
Để kiểm tra tính chuẩn của từ v[1..i], ta lưu ý rằng từ v[1..i-1] đã chuẩn (tính chất P), do đó chỉ cần
khảo sát các cặp từ có chứa v[i], cụ thể là khảo sát các cặp từ có chiều dài k đứng cuối từ v. Đó là các
cặp từ v[(i–k–k+1)..(i–k)] và v[i–k+1..i] với k = 1..(i div 2). Nếu với mọi k như vậy hai từ đều khác
nhau thì Chuan=true. Ngược lại, Chuan = false.
Hàm Bang(i,k) kiểm tra xem hai từ kề nhau chiều dài k tính từ i trở về trước có bằng nhau hay
không.
Hai từ được xem là khác nhau nếu chúng khác nhau tại một vị trí nào đó.
Trang 4
/3