62 lines
1.5 KiB
Plaintext
62 lines
1.5 KiB
Plaintext
MODULE RepStrings;
|
|
FROM InOut IMPORT Write, WriteString, WriteLn, WriteCard;
|
|
FROM Strings IMPORT Copy, Length;
|
|
|
|
(* Find the length of the longest rep-string given a string.
|
|
If there is no rep-string, the result is 0. *)
|
|
PROCEDURE repLength(s: ARRAY OF CHAR): CARDINAL;
|
|
VAR strlen, replen, i, j: CARDINAL;
|
|
ok: BOOLEAN;
|
|
BEGIN
|
|
strlen := Length(s);
|
|
FOR replen := strlen DIV 2 TO 1 BY -1 DO
|
|
ok := TRUE;
|
|
i := 0;
|
|
WHILE ok AND (i < replen) DO
|
|
j := i + replen;
|
|
WHILE (i+j < strlen) AND (s[i] = s[j]) DO
|
|
j := j + replen;
|
|
END;
|
|
ok := ok AND (i+j >= strlen);
|
|
INC(i);
|
|
END;
|
|
IF ok THEN RETURN replen; END;
|
|
END;
|
|
RETURN 0;
|
|
END repLength;
|
|
|
|
(* Store the longest rep-string in the given buffer. *)
|
|
PROCEDURE repString(in: ARRAY OF CHAR; VAR out: ARRAY OF CHAR);
|
|
VAR len: CARDINAL;
|
|
BEGIN
|
|
len := repLength(in);
|
|
Copy(in, 0, len, out);
|
|
out[len] := CHR(0);
|
|
END repString;
|
|
|
|
(* Display the longest rep-string given a string *)
|
|
PROCEDURE rep(s: ARRAY OF CHAR);
|
|
VAR buf: ARRAY [0..63] OF CHAR;
|
|
BEGIN
|
|
WriteString(s);
|
|
WriteString(": ");
|
|
repString(s, buf);
|
|
WriteString(buf);
|
|
WriteLn();
|
|
END rep;
|
|
|
|
(* Test cases *)
|
|
BEGIN
|
|
rep("1001110011");
|
|
rep("1110111011");
|
|
rep("0010010010");
|
|
rep("1010101010");
|
|
rep("1111111111");
|
|
rep("0100101101");
|
|
rep("0100100");
|
|
rep("101");
|
|
rep("11");
|
|
rep("00");
|
|
rep("1");
|
|
END RepStrings.
|