problem
Description
String专题又出现啦~\(≧▽≦)/~ 这次的题很水的啦0.0
一个字符串的子串是该字符串的一段连续子序列,如bca是abcabc的子串,而cc不是。
一个重复块(repeating block)由一个字符串与自身连接而成,如abcabc是一个重复块,而abcabd, ababab不是。
你有一个由拉丁字符组成的字符串。每一步你要找到它的子串中最短的重复块,如果有多于一个,你必须选择最左边的那个。你要将那个形如XX(X - 某个字符串)的重复块替换成X,换句话说你要删除其中的一个X。重复以上步骤直到字符串中不存在重复块。
最终的字符串会是怎样的?看样例解释来更清楚地理解问题描述。
Input
一行,一个由小写拉丁字符组成的字符串S。
Output
输出做完所有操作后的字符串。
Sample Input
aaaabaaab
Sample Output
ab
Data Constraint
对于10%的数据|S|<=10。
对于30%的数据|S|<=1000。
对于100%的数据1<=|S|<=50000。
analysis
正解太难看了暴力过的,碾压数据
枚举重复块长度 l ,枚举开头
j ,暴力判断虽说听着就很暴力,T90
然后把 l 控制枚举范围,即
min(482,len2) (482是最小可行范围)即可AC
code
var
s:ansistring;
i,j,l,len:longint;
bz:boolean;
function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end;
begin
//assign(input,'readin.pas');reset(input);
readln(s);
len:=length(s);
l:=1;
while l<=min(482,len) do
begin
j:=1;
while j<=len-2*l+1 do
begin
i:=j;
bz:=true;
repeat
if s[i]<>s[i+l] then
begin
bz:=false;
break;
end;
inc(i);
until i>j+l-1;
if bz then
begin
delete(s,j,l);
len:=length(s);
end
else inc(j);
end;
inc(l);
end;
writeln(s);
end.