传纸条(看清题目)

内容目录

传纸条(message)

【题目描述】

小N和小A上课喜欢传纸条。

传纸条是有风险的,为了在老师发现的时候不知道他们在讨论什么内容,他们发明了一系列的加密方式。

其中有一种是这样的:一个数字由两个字符串a和b表达,这个数字就是b在a中匹配的位置。比如,a=”abcd”,b=”c”,那么这个数字就是3。

但是这样会出现一个问题,a和b能够表达两个不同的数字:比如,a=“ababa”,b=”aba”时,那个数字可以是1也可以是3。

他们对这种现象很好奇,现在给定一个字符串a,求一个整数x使得对于任意一个长度大于x的串b,这一问题都不会出现。

【输入数据】

一个仅由小写字母组成的字符串a

【输出数据】

一行一个整数,表示x的最小值

【样例输入】

ababa

【样例输出】

3

【数据范围】

对于50%的数据,a的长度≤10,

对于100%的数据,a的长度≤100.


Program message;
var
   n,i,j,k,l,ans:longint;
   s:string;
function min(a,b:longint):longint;
begin
   if (a<b) then exit(a) else exit(b);
end;
function max(a,b:longint):longint;
begin
   if (a>b) then exit(a) else exit(b);
end;

begin
   assign(input,'message.in');
   assign(output,'message.out');
   reset(input);
   rewrite(output);


   readln(s);
   n:=length(s);
   ans:=0;
   for i:=1 to n do
      for j:=i+1 to n do
      begin
         k:=i;
         l:=j;
         while ((s[k]=s[l]) and (l<=n)) do
         begin
            inc(k);
            inc(l);
            if (l>n) then break;
         end;


         ans:=max(ans,k-i);

      end;
   writeln(ans);

   close(input);
   close(output);

end.

 

2 thoughts on “传纸条(看清题目)

  1. 个人感觉用O(n)足够了,lz觉得呢
    [code=cpp]
    int main(int argc, char* argv[])
    {
    if (argc < 2)
    {
    return -1;
    }

    unsigned int len = strlen(argv[1]);
    char* text = argv[1];
    int* next = malloc((len + 1)*sizeof(int));
    if (!next)
    {
    return -1;
    }

    int min = -1;
    int i = 0, j = -1;
    next[i] = j;
    while (i <= len)
    {
    while (j >= 0 && text[i] != text[j]) j = next[j];
    i++;
    j++;
    next[i] = j;
    min = min > j ? min : j;
    }
    free(next);
    printf("%dn", min);

    return 0;
    }
    [/code]

Comments are closed.