p1554.pas
来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· PAS 代码 · 共 107 行
PAS
107 行
PROGRAM p1554;
TYPE
Tf = array[1..100,1..100,0..2] of Longint;
VAR
s : String;
f : Tf;
FUNCTION Check ( a , l , k : Integer ) : Boolean;
var
i , j : Integer;
begin
for i := 1 to l div k - 1 do
for j := 0 to k - 1 do
if s [a + ( i - 1 ) * k + j ] <> s [a + i * k + j] then
exit ( false );
exit ( true );
end;
FUNCTION long ( p : Integer ) : Integer;
begin
exit ( trunc ( ln ( p ) / ln ( 10 ) ) + 1 );
end;
PROCEDURE Print ( p , l : Integer ) ;
var
i : Integer;
begin
if f [p] [l] [0] = 0 then
begin
write ( l div f [p] [l] [1] );
write ( '(' );
print ( p , f [p] [l] [1] );
write ( ')' );
end else
begin
if f [p] [l] [2] = l then
begin
for i := p to p + l - 1 do write ( s[i] );
end else
begin
print ( p , f [p] [l] [1] - p );
print ( f [p] [l] [1] , p + l - f [p] [l] [1] );
end;
end;
end;
PROCEDURE Dp;
var
len , i , j , k : Integer;
n : Integer;
begin
//writeln ( 's = ' , s);
len := length ( s );
//writeln ( 'len = ' , len );
for i := 1 to len do
for j := 1 to len - i + 1 do
begin
f [i] [j] [0] := 1;
f [i] [j] [1] := i;
f [i] [j] [2] := j;
end;
for j := 1 to len do
for i := 1 to len - j + 1 do
begin
for k := 1 to j - 1 do
if ( j mod k = 0 ) and check ( i , j , k ) then
begin
n := long ( j div k );
if n + 2 + f [i] [k] [2] < f [i] [j] [2] then
begin
f [i] [j] [2] := n + 2 + f[i] [k] [2];
f [i] [j] [0] := 0;
f [i] [j] [1] := k;
end;
end;
for k := i + 1 to i + j - 1 do
if ( f [i] [k - i] [2] + f [k] [j - k + i] [2] < f [i] [j] [2] ) then
begin
f [i] [j] [2] := f [i] [k - i] [2] + f [k] [j - k + i] [2];
f [i] [j] [0] := 1;
f [i] [j] [1] := k;
end;
end;
//writeln ( f [1] [len] [2] );
print ( 1 , len );
writeln;
end;
BEGIN
//assign ( input ,'p.in' );
//reset ( input );
while not eof do
begin
readln ( s );
Dp;
end;
END.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?