2012年佛山市GDOI选拔赛题 最长子串
Time Limit:10000MS Memory Limit:256000K
Total Submit:5 Accepted:4
Case Time Limit:1000MS
Description
对于一个串s0s1…sh-1shsh+1…s2h-1,该串的不同值是指两个串s0s1…sh-1和 shsh+1…s2h-1从左往右每一位依次进行比较时不同字符的个数。例如串abcaec的不同值为1,因为abc和aec按顺序比较时只有一位是不同的。
现在给出一个串,你需要找出该串是否包含一条长度为偶数的子串,该子串的不同值不超过一个给定的值D。如果你能找出不止一条这样的子串,请输出最长的那一串。如果有多个串的长度都是最长的,那么请输出起始点最左的子串。
Input
输入只有一行,首先给出整数D,紧接着是需要查询的串。该字符串由小写字母组成。
Output
如果你能找到一个子串,请输出最长的子串的长度和最长子串,用空格隔开。否则输出"Not Found"。
Sample Input
以下是3个样例输入:
1 f
0 kjjjgieie
0 abcd
Sample Output
以下是上面3个样例输入对应的输出:
Not found
4 ieie
Not found
Hint
数据规模:
对于30%的数据,有1≤N≤100,N为字符串长度。
对于100%的数据,有1≤N≤2000。
题解:N*N*N暴力水过
var
s,s1:ansistring;
d,i,j,k,l,t,q,p,max:longint;
b:boolean;
w:array[1..2000000]of ansistring;
f:array[1..2000000]of longint;
begin
// assign(input,'sub.in'); reset(input);
//assign(output,'sub.out'); rewrite(output);
readln(s);
i:=1;
while s[i] in ['0'..'9'] do
begin
s1:=s1+s[i];
inc(i);
end;
val(s1,d);
s1:='';
delete(s,1,i);
for i:=1 to length(s) do
begin
if (length(s)-i+1) mod 2<>0 then j:=length(s)-1 else j:=length(s);
while (j div 2>=d)and(j>0)and(j>i) do
begin
k:=i;
l:=(j+i) div 2+1;
t:=0;
while (k<=(j+i) div 2)and(l<=j) do
begin
if s[k]<>s[l] then inc(t);
inc(k);
inc(l);
if t>d then break;
end;
if t<=d then
begin
inc(q);
f[q]:=j-i+1;
w[q]:=copy(s,i,j-i+1);
b:=true;
break;
end;
dec(j,2);
end;
end;
if not b then begin writeln('Not found'); halt; end;
max:=-100;
for i:=1 to q do
if f[i]>max then begin max:=f[i]; p:=i; end;
write(f[p],' ',w[p]);
// close(input);
// close(output);
end.