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.