【距离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;