hdu 2203 亲和串 KMP算法

题目:自己看啦啦啦

分析:只要把第一个字符串加上第一个字符串再与第二个字符串进行KMP匹配就好了,因为第一个字符串加上它本身后,就已经包含了所有它循环移位后的字符串,比如串 "ABCD" 反复后为  "ABCDABCD" 在这个串中 "BCDA" , "CDAB" 以及 "DABC" 都接踵呈现了。用该种办法求解的过程中还应重视当子串长度跨越母串时不进行匹配,因为那样可能输失足误的断定,比如上例中子串为 "ABCDA" 那么也会输出 yes 了。

代码:

var
  x,y,s:ansistring;
  len,len1,len2,i,j:longint;
  next:array[0..200000] of longint;
  flag:boolean;

procedure get;
var
  i,j:longint;
begin
  next[0]:=-1;
  next[1]:=0;
  i:=2;
  j:=0;
  while i<=len do
    if (j=-1)or(s[j+1]=s[i])
      then begin
             inc(j);
             next[i]:=j;
             inc(i);
           end
      else j:=next[j];
end;

begin
  while not eof do
  begin
    readln(x);
    readln(y);
    len1:=length(x);
    len2:=length(y);
    s:=x+x;
    len:=len1*2;
    get;
    if len1<len2 then
    begin
      writeln('no');
      continue;
    end;
    i:=1;
    j:=0;
    flag:=false;
    while i<=len do
    begin
      if (j=-1)or(y[j+1]=s[i])
        then begin
               inc(i);
               inc(j);
             end
        else j:=next[j];
      if j=len2 then
      begin
        flag:=true;
        break;
      end;
    end;
    if flag
      then writeln('yes')
      else writeln('no');
  end;
end.


你可能感兴趣的:(hdu 2203 亲和串 KMP算法)