【距离GDOI:137天】 扩展KMP...字符串QAQ

   上次和黄神两人一合计,干脆我学字符串他学图论,然后两人相互教...但以蒟蒻最近这状态来看,估计会到时候也教不了QAQ

   扩展KMP大概是下面这个课件讲的这样

   http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html

   然后需要注意的是初始化问题:

   对于next数组,根据定义next[0]=len  ,而因为k<>0,否则next[i]=next[i-k]不成立...所以next[1]也要预处理出来,才能继续求出剩余的next

   对于extend数组,还是要预处理出ex[0],理由同上。暴力预处理即可...

   然后是P党的ansistring问题,有人说这东西会慢,而且不方便调试,蒟蒻干脆改成了char数组去模拟,还可以自己定义起点从0还是从1,我的代码是从0开始的,因为从1开始总是各种跪...估计是各种加加减减没处理好,干脆改成0了...反正以后滚去C++也是从0开始的...

   然后就是课件里面讲的那样了..

   主体代码如下...嗯有些变量名可能没声明...也没主程序...

 1 const maxn=500419;
 2 type
 3  extype=array[0..maxn] of longint;
 4  strtype=array[0..maxn] of char;
 5 var
 6  ex0,ex1:extype;
 7  s1,s2:strtype;
 8  next,sum:array[0..maxn] of longint;
 9 
10 procedure makenext(t:strtype;len:longint);
11 var p,i,k:longint;
12 begin
13  k:=0;
14  next[0]:=len;
15  while (k+1<len) and (t[k]=t[k+1]) do inc(k);
16  next[1]:=k;
17  k:=1; i:=2;
18  while i<len do
19   begin
20    p:=k+next[k]-1;
21    next[i]:=min(next[i-k],max(p-i+1,0));
22    while (i+next[i]<len) and (t[next[i]]=t[i+next[i]]) do inc(next[i]);
23    if i+next[i]>k+next[k] then k:=i;
24    inc(i);
25   end;
26 end;
27 
28 procedure makeext(t,s:strtype;var ex:extype;len:longint);
29 var p,i,k:longint;
30 begin
31  makenext(t,len);
32  k:=0;
33  while (k<len) and (s[k]=t[k]) do inc(k);
34  ex[0]:=k;
35  k:=0; i:=1;
36  while i<len do
37   begin
38    p:=k+ex[k]-1;
39    ex[i]:=min(next[i-k],max(p-i+1,0));
40    while (i+ex[i]<len) and (t[ex[i]]=s[i+ex[i]]) do inc(ex[i]);
41    if i+ex[i]>k+ex[k] then k:=i;
42    inc(i);
43   end;
44 end;
View Code

 

posted @ 2014-12-15 19:43  Ecsy  阅读(223)  评论(0编辑  收藏  举报