最长子串

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.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值