内容目录
传纸条(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.
个人感觉用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]
[reply]zhy006[/reply]
写这篇文章的时候我还不会KMP,膜拜zhy006神犇