上次和黄神两人一合计,干脆我学字符串他学图论,然后两人相互教...但以蒟蒻最近这状态来看,估计会到时候也教不了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 begin13 k:=0;14 next[0]:=len;15 while (k+1k+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 begin31 makenext(t,len);32 k:=0;33 while (k k+ex[k] then k:=i;42 inc(i);43 end;44 end;