2018.3.10 模拟赛——(2)给出字符串

题目大意:

给出一个由小写字母组成的字符串。你的任务是找出其最长的出现至少两次的子串的长度。这些重复出现的子串可以重叠,比如:ababa aba视为出现两次

解题思路:

数据较小,字符串长度≤100。
所以,枚举就可以过
首先枚举子串,然后在字符串里找子串(注意不能用pos,因为子串可以重叠)。找子串的过程也是枚举(方法比较low)

var
 s,s1,s2:string;
 i,j,n,maxn,sum,k,b:longint;
function max(x,y:longint):longint;
begin
 if x>y then exit(x)
 else exit(y);
end;
begin
 read(s);
 n:=length(s);
 for i:=1 to n do
  for j:=i to n do
   begin
    sum:=0;
    s2:=s;
    s1:=copy(s,i,j-i+1);//枚举子串并取出
    k:=1;
    b:=length(s1);//如果s2[k]到s2[b]与s1完全相等
    //则sum+1
    while (b<=n)and(sum<2) do
    //若b超出字符串范围,则子串出现不到两次,退出循环
    //如果子串出现两次,则不用继续找,退出循环
     begin
      if copy(s2,k,length(s1))=s1 then
       inc(sum);
      inc(k);
      inc(b);//继续枚举
     end;
    if sum>1 then
      maxn:=max(length(s1),maxn);
    //如果子串出现两次,与原先子串长度比较,取较长的子串的长度
   end;
  write(maxn);//愉快的输出
end.

你可能感兴趣的:(模拟,枚举,模拟赛)