Code 1:
Const
f1='D:\string.inp';
f2='D:\string.out';
Var s,t: string;
f,b: array[1..100] of string;
g,trace: array[0..100] of longint;
n,m: Longint;
Procedure Enter;
Begin
Assign(input,f1); Reset(input);
Readln(s);
Close(input);
end;
Function Bigger(x,y: string): Boolean;
Begin
while length(x) < length(y) do x := '0' + x;
while length(x) > length(y) do y := '0' + y;
if x>y then exit else exit;
end;
Procedure Process;
Var i,j,u: Longint;
Begin
Assign(output,f2); Rewrite(output);
n := length(s);
For i:=1 to n do f[i] := '';
f[1] := s[1];
g[1] := 1;
g[n] := 1;
For i:=2 to n do
begin
For j:=i-1 downto 1 do
begin
t := copy(s,j+1,i-j);
if Bigger(t,f[j]) then
if g[j] + 1 >= g[i] then
begin
f[i] := t;
g[i] := g[j] + 1;
trace[i] := j;
end;
end;
end;
if g[n] = 1 then
begin
writeln(s);
exit;
end;
u := n;
while u<>0 do
begin
inc(m);
b[m] := f[u];
u := trace[u];
end;
For i:=m downto 1 do write(b[i]);
Close(output);
End;
Begin
Enter;
Process;
End.
Code 2:
Program STR;
Var s: string;
n: byte;
x: array[0..150] of string;
i: integer;
ok: boolean;
Function isBigger(a, b: string): boolean;
Begin
while length(a) < length(b) do a := '0' + a;
while length(b) < length(a) do b := '0' + b;
exit;
End;
Procedure try(i: longint; st: string);
Var j: integer;
Begin
x[i] := '';
for j := 1 to length(st) do
begin
x[i] := x[i] + st[j];
if isBigger(x[i], x[i - 1]) or (i = 1) then
if j = length(st) then begin ok := true; n := i end
else try(i + 1, copy(st, j + 1, length(st) - j));
if ok then exit;
end;
End;
Begin
assign(input, 'D:\string.INP'); reset(input);
assign(output, 'D:\string.OUT'); rewrite(output);
readln(s);
x[0] := '';
ok := false;
try(1, s);
for i := 1 to n do write(x[i], ' ');
End.
Bài tập:
Bài 1. Biến đổi xâu
Cho một xâu S chỉ gồm các chữ cái in thường với độ dài tối đa 250 ký tự.
Em hãy viết chương trình để tạo ra xâu ST từ xâu S bằng cách xóa các ký tự liên
tiếp giống nhau trong xâu S và chỉ để lại một kí tự đại diện trong đoạn đó.
Dữ liệu vào: Đọc từ file văn bản Xau.Inp chứa xâu S chỉ gồm các chữ cái in
thường.
Kết quả: Ghi ra file văn bản Xau.Out là xâu ST tìm được.
Ví dụ
Xau.inp
Hhooocccsssiiiiinnnhhhgiiiiooi
Xau.out
hocsinhgioi
Bài 2. Ghép số lớn
Nam đã viết được một số lớn trên một cuộn giấy dài và muốn khoe với
anh trai về thành quả vừa đạt được. Tuy nhiên, khi Nam vừa ra khỏi phịng để
gọi anh trai thì cơ em gái chạy vào phòng và xé rách cuộn giấy thành một số
mảnh. Kết quả là trên mỗi mảnh có một hoặc vài kí số theo thứ tự đã viết. Bây
giờ Nam khơng thể nhớ chính xác mình đã viết số gì. Nam chỉ nhớ rằng đó là
một số rất lớn. Để giúp Nam truy tìm số nào là lớn nhất mà Nam đã có thể viết
lên cuộn giây trước khi bị xé. Hãy viết chương trình để thực hiện tìm giúp Nam.
Dữ liệu vào:
Ghi một hoặc nhiều dòng. Mỗi dòng ghi một dãy kí số. Số dịng khơng
vượt q 100. Mỗi dịng ghi từ 1 đến 100 kí số. Bảo đảm rằng có ít nhất một
dịng mà kí số đầu tiên khác 0.
Dữ liệu ra:
Ghi ra số lớn nhất đã có thể viết trên cuộn giấy trước khi bị xé rách.
Ví dụ
Ghepso.inp
2
Ghepso.out
66220004
20
004
66
3
3
* Ý tưởng: Lưu các số dưới dạng mảng kiểu xâu, thực hiện sắp xếp mảng
theo thứ tự tăng dần theo tiêu chí sắp xếp là phần tử s[i] đứng trước phần từ s[j]
khi (s[i] ghép với s[j]) > (s[j] ghép với s[i])