KMP算法详解

    如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。

    我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?”
    解决这类问题,通常我们的方法是枚举从A串的什么位置起开始与B匹配,然后验证是否匹配。假如A串长度为n,B串长度为m,那么这种方法的复杂度是O (mn)的。虽然很多时候复杂度达不到mn(验证时只看头一两个字母就发现不匹配了),但我们有许多“最坏情况”,比如,A= "aaaaaaaaaaaaaaaaaaaaaaaaaab",B="aaaaaaaab"。我们将介绍的是一种最坏情况下O(n)的算法(这里假设 m<=n),即传说中的KMP算法。
    之所以叫做KMP,是因为这个算法是由Knuth、Morris、Pratt三个提出来的,取了这三个人的名字的头一个字母。这时,或许你突然明白了AVL 树为什么叫AVL,或者Bellman-Ford为什么中间是一杠不是一个点。有时一个东西有七八个人研究过,那怎么命名呢?通常这个东西干脆就不用人名字命名了,免得发生争议,比如“3x+1问题”。扯远了。
    个人认为KMP是最没有必要讲的东西,因为这个东西网上能找到很多资料。但网上的讲法基本上都涉及到“移动(shift)”、“Next函数”等概念,这非常容易产生误解(至少一年半前我看这些资料学习KMP时就没搞清楚)。在这里,我换一种方法来解释KMP算法。

    假如,A="abababaababacb",B="ababacb",我们来看看KMP是怎么工作的。我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符(j当然越大越好),现在需要检验A[i+1]和B[j+1]的关系。当A[i+1]=B[j+1]时,i和j各加一;什么时候j=m了,我们就说B是A的子串(B串已经整完了),并且可以根据这时的i值算出匹配的位置。当A[i+1]<>B[j+1],KMP的策略是调整j的位置(减小j值)使得A[i-j+1..i]与B[1..j]保持匹配且新的B[j+1]恰好与A[i+1]匹配(从而使得i和j能继续增加)。我们看一看当 i=j=5时的情况。

    i = 1 2 3 4 5 6 7 8 9 ……
    A = a b a b a b a a b a b …
    B = a b a b a c b
    j = 1 2 3 4 5 6 7

    此时,A[6]<>B[6]。这表明,此时j不能等于5了,我们要把j改成比它小的值j'。j'可能是多少呢?仔细想一下,我们发现,j'必须要使得B[1..j]中的头j'个字母和末j'个字母完全相等(这样j变成了j'后才能继续保持i和j的性质)。这个j'当然要越大越好。在这里,B [1..5]="ababa",头3个字母和末3个字母都是"aba"。而当新的j为3时,A[6]恰好和B[4]相等。于是,i变成了6,而j则变成了 4:

    i = 1 2 3 4 5 6 7 8 9 ……
    A = a b a b a b a a b a b …
    B =     a b a b a c b
    j =     1 2 3 4 5 6 7

    从上面的这个例子,我们可以看到,新的j可以取多少与i无关,只与B串有关。我们完全可以预处理出这样一个数组P[j],表示当匹配到B数组的第j个字母而第j+1个字母不能匹配了时,新的j最大是多少。P[j]应该是所有满足B[1..P[j]]=B[j-P[j]+1..j]的最大值。
    再后来,A[7]=B[5],i和j又各增加1。这时,又出现了A[i+1]<>B[j+1]的情况:

    i = 1 2 3 4 5 6 7 8 9 ……
    A = a b a b a b a a b a b …
    B =     a b a b a c b
    j =     1 2 3 4 5 6 7

    由于P[5]=3,因此新的j=3:

    i = 1 2 3 4 5 6 7 8 9 ……
    A = a b a b a b a a b a b …
    B =         a b a b a c b
    j =         1 2 3 4 5 6 7

    这时,新的j=3仍然不能满足A[i+1]=B[j+1],此时我们再次减小j值,将j再次更新为P[3]:

    i = 1 2 3 4 5 6 7 8 9 ……
    A = a b a b a b a a b a b …
    B =             a b a b a c b
    j =             1 2 3 4 5 6 7

    现在,i还是7,j已经变成1了。而此时A[8]居然仍然不等于B[j+1]。这样,j必须减小到P[1],即0:

    i = 1 2 3 4 5 6 7 8 9 ……
    A = a b a b a b a a b a b …
    B =               a b a b a c b
    j =             0 1 2 3 4 5 6 7

    终于,A[8]=B[1],i变为8,j为1。事实上,有可能j到了0仍然不能满足A[i+1]=B[j+1](比如A[8]="d"时)。因此,准确的说法是,当j=0了时,我们增加i值但忽略j直到出现A[i]=B[1]为止。
    这个过程的代码很短(真的很短),我们在这里给出:

j:=0;
for i:=1 to n do
begin
   while (j>0) and (B[j+1]<>A[i]) do j:=P[j];
   if B[j+1]=A[i] then j:=j+1;
   if j=m then
   begin
      writeln('Pattern occurs with shift ',i-m);
      j:=P[j];
   end;
end;

    最后的j:=P[j]是为了让程序继续做下去,因为我们有可能找到多处匹配。
    这个程序或许比想像中的要简单,因为对于i值的不断增加,代码用的是for循环
。因此,这个代码可以这样形象地理解:扫描字符串A,并更新可以匹配到B的什么位置。

    现在,我们还遗留了两个重要的问题:一,为什么这个程序是线性的;二,如何快速预处理P数组。
    为什么这个程序是O(n)的?其实,主要的争议在于,while循环使得执行次数出现了不确定因素。我们将用到时间复杂度的摊还分析中的主要策略,简单地说就是通过观察某一个变量或函数值的变化来对零散的、杂乱的、不规则的执行次数进行累计。KMP的时间复杂度分析可谓摊还分析的典型。我们从上述程序的j 值入手。每一次执行while循环都会使j减小(但不能减成负的),而另外的改变j值的地方只有第五行。每次执行了这一行,j都只能加1;因此,整个过程中j最多加了n个1。于是,j最多只有n次减小的机会(j值减小的次数当然不能超过n,因为j永远是非负整数)。这告诉我们,while循环总共最多执行了n次。按照摊还分析的说法,平摊到每次for循环中后,一次for循环的复杂度为O(1)。整个过程显然是O(n)的。这样的分析对于后面P数组预处理的过程同样有效,同样可以得到预处理过程的复杂度为O(m)。
    预处理不需要按照P的定义写成O(m^2)甚至O(m^3)的。我们可以通过P[1],P[2],…,P[j-1]的值来获得P[j]的值。对于刚才的B="ababacb",假如我们已经求出了P[1],P[2],P[3]和P[4],看看我们应该怎么求出P[5]和P[6]。P[4]=2,那么P [5]显然等于P[4]+1,因为由P[4]可以知道,B[1,2]已经和B[3,4]相等了,现在又有B[3]=B[5],所以P[5]可以由P[4] 后面加一个字符得到。P[6]也等于P[5]+1吗?显然不是,因为B[ P[5]+1 ]<>B[6]。那么,我们要考虑“退一步”了。我们考虑P[6]是否有可能由P[5]的情况所包含的子串得到,即是否P[6]=P[ P[5] ]+1。这里想不通的话可以仔细看一下:

        1 2 3 4 5 6 7
    B = a b a b a c b
    P = 0 0 1 2 3 ?

    P[5]=3是因为B[1..3]和B[3..5]都是"aba";而P[3]=1则告诉我们,B[1]、B[3]和B[5]都是"a"。既然P[6]不能由P[5]得到,或许可以由P[3]得到(如果B[2]恰好和B[6]相等的话,P[6]就等于P[3]+1了)。显然,P[6]也不能通过P[3]得到,因为B[2]<>B[6]。事实上,这样一直推到P[1]也不行,最后,我们得到,P[6]=0。
    怎么这个预处理过程跟前面的KMP主程序这么像呢?其实,KMP的预处理本身就是一个B串“自我匹配”的过程。它的代码和上面的代码神似:

P[1]:=0;
j:=0;
for i:=2 to m do
begin
   while (j>0) and (B[j+1]<>B[i]) do j:=P[j];
   if B[j+1]=B[i] then j:=j+1;
   P[i]:=j;
end;

    最后补充一点:由于KMP算法只预处理B串,因此这种算法很适合这样的问题:给定一个B串和一群不同的A串,问B是哪些A串的子串。

    串匹配是一个很有研究价值的问题。事实上,我们还有后缀树,自动机等很多方法,这些算法都巧妙地运用了预处理,从而可以在线性的时间里解决字符串的匹配。我们以后来说。

    昨天发现一个特别晕的事,知道怎么去掉BitComet的广告吗?把界面语言设成英文就行了。
    还有,金山词霸和Dr.eye都可以去自杀了,Babylon素王道。

Matrix67原创
转贴请注明出处

244 条评论

  • 酸辣热狗

    MM说:我的告白语是“其实。。。我喜欢的并不是matrix67,我喜欢的是你啊,Hotdog”

    恭喜你。。你是她告白语里的子串。

    回复:你的英文名字咋不是sour-and-hot dog ?

  • edwin89102

    你说的比数据结构还要好

  • evalls

    不过kmp是我到目前为止唯一没有实现的东西。一律用prefix tree……所以不会写kmp

    回复:前缀树?

  • flyingforever

    您的预处理程序代码有问题…

    回复:谢谢提醒,已改正;我错把B写成P了

  • flyingforever

    请问代码关键字高亮您是怎么弄的?

    回复:http://www.matrix67.com/blog/article.asp?id=203

  • savy.ch

    sounds interesing.

    不过只要一句话个旧可以归纳出来。

    find the the model of the shor pattern by self match for shift.

    这个算法在notepad上有很多应用。但是,一般用另一个算法:BM

    回复:同意

  • 123

    MS懂了,谢谢,但 P[3]=1则告诉我们,B[1]和B[5]都是"a"?B[1]和B[3]吧。

    回复:没写错,B[1]=B[3]=B[5],省略了中间步骤。这里B[1]=B[5]才是我们需要的结论。

  • cool_leaf_xp

    good

  • mlxia

    倒数第七段

    …每一次执行while循环都会使j减小(但不能减成负的),而另外的改变j值的地方只有第五行。每次执行了这一行,j都只能加1;因此,整个过程中j最多加了n个1。于是,j最多只有n次减小的机会(j值减小的次数当然不能超过n,因为j永远是非负整数)。这告诉我们,while循环总共最多执行了n次。…

    这里不大明白,整个过程中j是在回退然后前进的,假设第一遍比较回退一次,第二遍比较回退两次,于是总共加起来j减小和变大的次数都要大于n,不是吗?

    回复:我每年新交1个MM,我100年内会失恋200次吗?

  • roger

    其实它是传说中的看毛片算法 我在百度上搜了三篇全是你的 版权问题哟

    回复:看毛片算法……嗯,有才

  • Richardyi

    11楼的同学。。。你太。。。了。。。

  • Richardyi

    11楼的同学,这条评论应该加上:
    “The comment is R-rated”.

  • FireKidd

    请问为什么我用这个方法去写vijos p1005(超长数字串)会超时,那个题是不是还有更快的方法啊,能不能讲解一下
    谢谢

    回复:那道题数字串太长,根本不是让你去模拟的,而是直接对输入数据尝试进行“分割”

  • dahe_1984

    强烈支持!!!写的简洁透彻,,,

    同时鄙视各种吃人饭不干人事教育部的全体博士,教授,导师,博士后等等系列烂人!!!

  • visitonly

    想请教下所谓"扩展KMP"是什么东西?
    请不要回答–由KMP扩展而来….听得太多了…..

  • 研究僧

    搞不懂p[5]=3是怎么一回事,帮忙解释一下

  • leon

    而P[3]=1则告诉我们,B[1]和B[5]都是”a”。
    这句话是错的吧?应该是B[1]和B[3]都是“a”吧

    回复:b[1]=b[3]=b[5],我省略了。不少人都有这个疑问,我补充了一下原文。

  • san

    原来这篇文章是你们的呀!哈哈,找到原文了!

  • dogygb

    经典,谢谢~~~~~~~~~看到转载的,不过很有礼貌的说了原文出处,就直接过来看了

  • 孤柏

    能不能给一个具体的例子?
    我是初学者,谢谢

  • lemon_cn

    和MM约会……..
    很好很强大….

  • aluex

    留下脚印,见证我曾经被KMP搞昏过..

  • cyc

    我终于找到一个能看得懂的了
    太谢谢了

  • MZD

    太感谢了,真是我们这些菜鸟的福音啊!

  • arena_zp

    强大的Matrix67
    终于懂了什么是 看毛片算法了

  • lodanc

    vijos P1425可以用KMP做吗?我怎么TLE了5个点呢?请教Matrix67牛~

  • nalaygnem

    今晚老师讲课的内容,读完本文后如醍醐灌顶。

  • hfyzxuesheng

    不可否认我的低智商,看了好多遍才看懂呵呵谢谢大牛啊
    有没有别的比较好的参加NOIP可以用到的算法,如果可以的话请发到我
    的邮箱742766614@qq.com

  • cyclone77

    我跟33楼一样
    我的邮箱是cyclone77@126.com
    主页:http://cyclone77.cn

  • catouse

    正是我所要找的,哈哈,谢谢了

  • Felix021

    发现一个小问题。。。
    while (j>0) and (B[j+1]B[i]) do j:=P[j];
    这句貌似应该加上一个越界限制判断吧?
    while (j>0) and (j+1 < m) and (B[j+1]B[i]) do j:=P[j];

  • Felix021

    我错了=.= 没理解透,重新看。。。

  • ^.^

    非常感谢你。

  • chris

    good!那么直接的东西 为什么那些课本要那么绕 thx~

  • wwx

    好棒!今天,终于懂了KMP算法!

  • abilitytao

    老师上课讲的很模糊 还以为很难 但是看看你的文章一下子就明晰了 多谢~
    我的QQ 64076241 希望能和你多交流^_^

  • abilitytao

    为什么我的42楼 与众不同呀

  • burberry

    如果直接用copy函数,和kmp比,谁的效率更高啊?
    我很菜,5bs

  • Jungle

    膜拜呀
    有个例子讲解太好类
    那些没例子的教程都去死吧

  • kaiser

    写的真好,我终于看懂了,谢谢。

  • abilitytao

    可以写书了 ,绝对经典教材

  • knight

    偶然路过此地,深感惭愧。你真很有才,这个世界牛人多得数不清了:)

  • SHvsMK

    有空的时候可不可以在写一篇关于DLX算法的?很期待哟!

  • Cold Dog

    WASAI 敬仰
    ^_^写个CPP的好不好?谢谢!

  • Henly Dry

    11楼的同学你有些太那个了
    I服了U

  • wecing

    坚持啃CLRS的人路过……

  • Alca

    好吧,膜拜中。。。比dejiwei讲的清楚多了~不过话说是他叫我来看的。

    Ps.文章我转了。

  • Skyprophet

    传说中KMP讲解的神一般的文章……

  • dic

    很精辟,一个钟头让我明白KMP的实现。。。

  • crazylamb

    没看明白wiki上KMP algorithm的童鞋到此一游。

  • Aule

    writeln(‘Pattern occurs with shift ‘,i-m);
    我觉得应该是i-m+1

    这东西写的太tm好了!!!
    AC了!

  • rzehpk

    第二自然段中
    复杂度应该是 是O ((m-n)n)吧….
    嘿嘿…

  • MG

    第六段中出现了一个j=m。m是什么?

  • Tanky Woo

    Matrix67神牛的文章果然令人受益匪浅,配合《散发导论》效果很好,谢谢。

  • exmorning

    这代码是什么语言,是什么符号?

  • louis

    B=”ababacb”,…P[4]=2

    我想知道这个P[4] = 2 是怎么得出来的.

  • B.b

    搜狗打 kmp。。。。。。。。

  • Crazzie

    看了Matrix67大牛的文章感觉就是不一样~

  • runcoderen

    while (j>0) and (B[j+1]A[i]) do j:=P[j];

    为什么不是A[i+1]呢?
    在文章中不是B[j+1]同A[i+1]比较吗?

  • runcoderen

    不好意思,再次打扰了啊。。。
    数组P需要自己求吗?那这样的话,求P数组应该也需要一定时间的吧,那么KMP整个算法的效率应该包含两部分了?
    1:求P数组各个值
    2:求子串

  • UnCle

    谢谢大神指点,一看就懂了

  • Xqwait

    既然P[6]不能由P[5]得到,或许可以由P[3]得到。

    为什么不是先检测P[6]是不是由P[4]得到,而越过p[4]检测p[3] ?
    j:=P[j]; 而不是j:=j-1 ?

  • Xqwait

    既然P[6]不能由P[5]得到,或许可以由P[3]得到。

    为什么不是先检测P[6]是不是由P[4]得到,而越过p[4]检测p[3] ?
    j:=P[j]; 而不是j:=j-1 ???

  • UnCle

    突然发现,和算导上的代码神似

  • zdf

    Orz终于将KMP弄懂了、、

  • ironcircle

    I wonder 拓展KMP是神马

  • Heaven

    看毛片算法…终于懂了

  • tom

    while (j>0) and (B[j+1]A[i]) do j:=P[j];
    hi~ 我怎么觉得这句可以用if,不需要while,就是当B[j+1]!=A[i]时就换j,并且你的while也没循环啊,根据摊还复杂度不是O(1)?

  • aishanmei

    why?j’必须要使得B[1..j]中的头j’个字母和末j’个字母完全相等(这样j变成了j’后才能继续保持i和j的性质)。

  • asd

    哇哇~看毛片算法

  • kk

    哈哈谢谢

  • leopard

    除了 “P[3] = 1 告诉我们 B[1],B[3],B[5]都是a ”这句话不理解外, 其他真的讲的很容易懂。。。虽然上面的回复中讲过, 但还是有点迷惑。

  • engine

    强大!

  • engine

    NB,强大!

  • bluehattree

    貌似有问题吧
    以下代码
    Program KMP;
    Const
    a=’abababaabab’;
    b=’ababa’;
    Var
    i,j:integer;
    P:Array[1..10]of integer;
    Begin
    {Calc P}
    P[1]:=0;
    j:=0;
    for i:=2 to length(b) do
    begin
    while (j>0) and(B[j+1]B[i]) do j:=P[j];
    if B[j+1]=B[i] then inc(j);
    P[i]:=j;
    End;
    j:=0;
    for i:=2 to length(a) do
    begin
    while (j>0)and(B[j+1]a[i]) do j:=P[j];
    if B[j+1] = A[i] then inc(j);
    if j= length(b) then
    begin
    writeln(i-length(b));
    j:=P[j];
    End;
    End;
    End.
    输出的是2哦

  • KMP

    “110001” in “11010001”?

  • YDN

    代码与《算导》上的神似。。。。。。

  • noi

    写的太好了,真的获益匪浅。大牛能不能写个BM算法,让我们学习学习。
    Orz
    Orz

  • -Fly梦-

    赞详细,看懂了为什么要左边字符串等于右边字符串了!

  • 好吧好吧

    我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。
    M67大牛··弱弱的问一句这句话什么意思?

  • Wicky

    光看这个值就知道博主错了 P = 0 0 1 2 3 ?

  • wqc0712

    回104楼,你看的这个P是没有加优化的,不要觉得人家是错的。

  • 周周

    你是怎么想到的?

  • chaojiaini

    可能我比较笨吧,对于那个p[]是怎么都不懂为什么,他的值是怎么得到的,为什么那样写,while (j>0) and (B[j+1]A[i]) do j:=P[j];这句是为什么

  • 阿罗

    “KMP的预处理本身就是一个B串“自我匹配”的过程”
    看了这句话,豁然开朗!

  • Horizon

    大神?您年方几何了啊,我想跟你交个朋友啊

  • 荒野无灯

    传说中的看毛片算法

  • Misaa

    膜拜。多谢大婶!!会了。o(∩_∩)o 哈哈

  • Yx.Ac

    学习了,谢谢Lz

  • 小拿

    讲的太清楚了

  • 乘用车

    大大的顶

  • bcegkmqsw

    要顺便介绍扩展kmp,就更好了

  • freeboy1015

    太牛了!讲的很浅显易懂!

  • 幻影射手

    小岛,是你么?鼓掌啊

  • ___

    这篇文章写的很赞,不过有个疑问,在模式匹配和计算next时候, if B[j+1]=B[i] then j:=j+1;可以简写成 j:=j+1;不需要B[j+1]=B[i]这个判断了,因为上面的while循环之后,要么一定是找到了确实相等,要么到达位置0处,这些状态下都等着相加操作。

  • asd

    把这一句while (j>0) and (B[j+1]B[i]) do j:=P[j];直接改成if (j>0) and (B[j+1]B[i]) do j:=0;如何?

  • asd

    把这一句while (j>0) and (B[j+1]B[i]) do j:=P[j];直接改成if (j>0) and (B[j+1]B[i]) then j:=0;如何?

  • 天煞孤星

    您写得真好,把我的理解硬伤全都瞬秒了~~~

  • 大腹

    感谢Matrix大神的精彩讲解,终于在您这里明白了KMP算法。

  • james

    使我明白KMP的文章

  • 脑子比记性好使的桑德

    自己写字符创匹配的时候就觉得BM有些操作是浪费掉的,这很不科学,原来这就是KMP啊。偷懒光荣!浪费可耻!

  • 脑子比记性好使的桑德

    不要浪费每一步操作和尽量一次都做点儿事是算法优化的关键。KMP是前者

  • 撒旦我是人

    神一样的M67,讲的确实特别清楚

  • dark_dream

    膜拜啊,终于看懂了 ,算导上面没看明白。。。

  • Iris_HIT

    kmp代码中:
    if j=m then

    j:=P[j];//此时必有B[j+1]A[i+1],是否不要这句也可以?

  • TreeDiagram

    写得不错,受教了

  • JackieZhu

    看了下评论,看到vijos P1425,想了下,没想出怎么分割。请教下大神该题的思路

  • 轮尘的风

    大有收获

  • asdf

    if j=m then
    begin
    writeln(‘Pattern occurs with shift ‘,i-m);
    j:=P[j];
    end;
    这是不知道是什么语言写的。
    但是我用c++实现时,这里有一个问题。比如wcwcw,模式是wcw前3位匹配完成后,j=p[j]=1,然后i加一,意思是下一轮开始,第4位置的c和第一位置的w比较吗,这样岂不是少匹配一个wcw?求楼主赐教。

  • 我是一只鱼

    唯有感谢!!

  • merry

    哎你写的最清晰了 赞

  • Natureal

    时隔半年,重温KMP时看到这篇文章,大彻大悟!

  • Atlantis67

    你的界面风格换了之后那个KMP的数组模拟没有对齐了= =

  • ChinaMoe

    感谢。
    看上去比算导的描述简单了不少Orz

  • noplacelikehome

    哇,大神们都叫我来看你的文章、膜拜一下

  • dayandnight

    初入ACM一年中,缓缓行,不过还是很感谢大大的~~牛文章

  • wanda

    这篇文章写的很好,一看就懂了

  • CCs3c3

    京都三叹  故宫  故 安卓手机壁纸 宫,好个气派的安卓手机壁纸宫殿!金碧辉煌,雄伟壮观,器宇轩昂,肃穆庄严。宛如一部雄壮的浙江卫视中 浙江卫视中国好声音直播 国好声音直播史诗令人心潮澎湃,又如一部宏伟的男子起诉民族交响乐让人荡气回肠。  故宫经历了六百年的肖亚庆 天津市长风雨侵袭,而至今风采依旧。朱墙黄瓦,光辉夺目;雕梁画栋,美轮美奂;檐牙高啄,错落有免费顶级域名注册致;一景一兽,栩栩如 男子起诉 生。古人神奇的想象力与创造力令人叫绝,不得不叹为观止了。  故宫是站长统计工具皇上发号施令的所在释小龙在少林寺的辈分。皇上尽管也是秦国栎阳肉体凡胎,而一经穿上龙袍,登临九五之尊,便成了真龙天子,一国之君,可以脚踩八荒,纵横宇内,鞭笞万民,宰割天下了。

  • CCz7q2

    走向成功之忠诚你的选择  不知道 五胞胎大肚子孕妇图 还有五胞胎大肚子 新浪微博登入 孕妇图多少人记得,三国里面关羽千里走单骑,过五关斩六将的新浪微博登入故事;这是篮球场跃出鲸鱼掀巨浪一个流传了几百年不朽的富豪女开豪车搭讪男子神话,但往往人就是地铁大妈这样,在京东投诉电话追求神话的zblog优化时候却忽略了一些事情;那些事情都是值得我 篮球场跃出鲸鱼掀巨浪 们深思和学习的伊能静老公秦昊。关羽忠诚了自己的选择,即使是千里之路,困难丛丛他也要坚持的走下去;那些拦路堵截的将领,他们也是忠诚了自己的选择,即使知道要死,也愿意用死来捍卫自己的选择;说到忠诚,说到高尚,我倒觉得那些将领都要比关羽忠诚多了。关羽在已婚前女友当时是一个了不起的大人物,那些将领只不过是微不

  • CCc5l3

    我为书狂  唯好书与美景不可辜负,一直信这句。再次被书魔怔,已经是北京东路的新浪网盘日子伴奏上班以后好几年的SEO网络推广事了。 北京东路的 遥记上一回,好像还是白百何露脐装上大一之前那个漫长的代姐结婚假戏真做论坛暑假。那时候,把老爸唯一送过我的电脑怎么设置密码礼物一套中国古典十大名著粗浅看了看 SEO网络推广 ,还把书摊上淘来的《周国平全集》看了几遍。  古典名著里《红楼梦》是必看的。但我喜欢跳着看,比如《强欢笑蘅芜庆生辰,死缠绵潇洒闻鬼哭》这一章节,我至少看过四五回。第一回看依稀是初中时候,当时书中很多东西还显晦涩不太好懂,但是单单这一黛玉死去时的章节,却看得人从初中泪水涟涟到高中。这一章每看必哭,每哭必遭来老妈带着好 白百何露脐装

  • CCw3o2

    高一(1)班我的幸福家园  中考结束后,我意外的金山系统重装高手来到天外,既 金山系统重装高手 有新浪uc些欣慰,又不免有深圳山体滑坡视频些许的花光积蓄养百只猫失落,但是中国政府我还是lolez教学视 新浪uc 频坚定的货车压扁轿车告诉自己:我不后悔,这是我的上海包子机选择,这里是我的归宿,更是我实现梦想的舞台。  带着坚定的信念,我走进了天外的校门,我细细地打量着周围的人,映入眼帘的是一张张陌生的脸庞。这令我欣喜,因为一切人一切事都是新的,我的人生将从“新”开始;但又令我害怕,因为我害怕自己无法与这里的人和谐相处,害怕着自己将适应不了天外快节奏高效率的生活,害怕未来会发生许多无法意料的事情。  就这样, 深圳山体滑坡视频 我带着既欣喜又害怕的

  • CCc1f4

    少年四大名捕 电视剧 三峡情节  年的少年四大名捕 电视剧时候,读李白的中戏姐妹花校花张馨心诗《早发白帝城》,我就浮想联翩:那漫天的周子瑜致歉 新浪彩 中戏姐妹花校花张馨心 云,飘荡在京东商城货到付款山间的搜狗游戏中心小船,两岸啼不住的猴,应该还向船上的游人们挤眉溜眼吧……  1991年国庆节,单位组织去三峡,我怀着儿子五六个月了,无奈与三峡失之交臂!  我密切关注着三峡:1997年11月8日大江截流 周子瑜致歉 新浪 后,水位提高到10-75米,三峡一切景观不受影响。这时儿子五岁,只要感冒就因扁桃炎而发烧,哪敢远行;2003年6月,第二期工程结束后,水位提高到135米,三峡旅游景区除张飞庙被淹将搬迁外,其余景区基本保存。  这时儿子小学毕业,可是高铁15元

  • 聆听心声

    敢怠慢,直接急促的回身而去,为古元等人通传着情报。 “古帝洞府,真的是在岩浆之底?”彩鳞也是有些惊奇的望着那岩浆通道,启齿道,当年她 剩下的二十三名归我来带 怎么说也是在这里而呆了一段时光,不过 1307 却没有半点的察觉。 “嗯。”萧炎点了摇头,旋行将岩浆之底所产生的事件大抵的说了一遍,而当薰儿等人听到那岩浆之底的空间中,剩下的二十三名归我来带,竟然存在着一道足以跟古元,魂天帝这等强人媲美的神秘生物时,神色也是忍不住的有些巨变。 “还好,那神秘生物仿佛是不能脱离那片空间,不然的话,本日怕是会有些大麻烦。”萧炎苦笑了一声 没措施朱司其只好把电话打给巨匠兄 ,1307,略有点庆章的道,从那大家伙展示而出的实力来看,没措施朱司其只好把电话打给巨匠兄,若

  • 精彩每一天

    之下,也是可能坚持着妊定,这与上次那种连面都未曾见到,便是被威压震碎比拟,已经是好上了无数 “唐志刚 倍。 这一次进入那所黝黑大殿,播种也不小,当然,“唐志刚,最令 等鬼谷子跟李承风来汇合 得萧炎安心的,仍是药老仍旧保险,虽说看上去情形不是很好,但至少并未涌现生命垂危般的状态,不外即便如斯,等鬼谷子跟李承风来汇合,萧炎也晓得,自己得尽量加快一些行程了,药老可以保持这么多年,已是殊为不易,若是再拖几年时间的话,就真的谁也不知道会产生什么事情了。 “等将这里的事情结束,便去那风雷阁,不论如何, 尸体只是在旁边 必定要寻到风尊者,必需要有他的帮忙,方才干尽快的将药老拯救出来。” 心中打定了主张,萧炎也是轻松了一口吻,心神沉入体内,细细的

  • 致力服务

    一道雄壮的猖狂笑声忽然响彻而起,最后在天空上浩浩大荡的响彻而起。 “雁落天!”听得这笑声,要塞之上的 带上我好吗 美杜莎等人 不论其禀赋如何优良 面色顿时冷了下来,从嘴中吐出一个在落雁帝国拥有着无比权威的名字。 而跟着笑声落下,一道残暴金光陡然从雄师之中暴冲天际,旋即悬浮天空,世人目光一瞟,却是见到一位身着金衣的男子悬浮天涯,在其身后,有着一对异常宏大的金色雁翅,金光闪闪,宛如天神个别。 在这位金衣男子现身之后,那黑压压的部队之中,登时响彻起惊天 里面包括着很多秘密 动地的欢呼声,显然,这个雁落天,在他们心中占有着极高的名誉。 美杜莎脸颊冰寒的凝视着雁落天,旋即身形一动,再次出现时,已至要塞外的天空上,她目光扫过后者,却是一笑

  • 致力服务

    ,强之间的承喏,岂非还能有假不成?”嘲笑着摇了摇头,海波东拍着胸口,打着包票道:“只有小兄弟能将我所须要的丹药炼制出来,老夫必定 其它跟平凡也差未几朱司其决议回本人学艺的山上一趟 不会食言!” “呵呵,其它跟平凡也差未几朱司其决议回本人学艺的山 “不会吧 上一趟,那样天然最好。”笑眯眯的点了摇头,萧炎对着海波东扬了扬下巴,“不会吧,微笑道:“既然如斯,那咱们便动工吧?” “现在?”海波东一愣,旋即匆忙拍板:“好,好,1762,请!”说着,他便是赶快推开柜台,而后将萧炎迎进了后屋之内。 进入屋中,萧炎随便的坐在椅上,眼光瞟向海波东,嘴角稍微挑起一抹笑意,轻声道:“药方,资料……” “有时候,我现你们这 1762 些炼药师,还真的让人爱慕…唉,这张

  • 致力服务

    的长老,权 由青少年基金会供给剩下的九百九十九所盼望小学援建地也交给了发媒体 力不比族长小。 在四人的左手下方,坐着家族中一些有话 不置可否 语姑且实力不弱的长辈,由青少年基金会供给剩下的九百九十九所盼望小学援建地也交给了发媒体,在他们的身旁,也有一些在家族中表示出色的年轻一辈。 另外一边,不置可否,坐着三位生疏人,想必他们便是昨夜萧战口中所说的贵客。 有些怀疑的目光在陌生的三人身上扫过,三人之中,有一位身穿月白衣袍的老,老满脸笑颜,精神奕奕,一双有些渺小的双眼, 2895 却是精光偶闪,萧炎的视线微微下移,最后停在了老胸口上,心头猛然一凛,在老的衣袍胸口处,赫然绘有一弯银色浅月,在浅月四周,还有装点着七颗金光闪闪的星辰。 “七星大斗师!这白叟竟然是一位七星大

  • 心得交流

    步一个蹒跚,瘫倒在地,骇然道:“你你毕竟干了什么?” 在先前萧炎着手的那一刻,他不觉得丝毫的斗气波动,而那十几人,便是诡异的 如斯之强的实力 化为了黝黑灰烬。 跟着刀疤汉子的骇 好家伙 然声音。那卡岗与苓儿,也是从这般震惊中回过神来,望着眼前的黑袍青年,如斯之强的实力,眼中逐步的出现一分狂喜,没想到这个年轻人,竟然有这如斯恐怖的实力,看来本日,他们是有救了。 萧炎目光淡薄的望着那踉跄撤退的刀疤男子,好家伙,手掌缓缓举起,遥遥对准着他,掌心中,无形之火,陡然闪现。 噗! 又是一声烦闷声音,那刀疤男子脸庞上连丝毫表情都还未展露出来,那从其体内呈现的熊 303 熊心火,便是在瞬间,将之焚烧成了一团玄色灰烬。

  • 致力服务

    炎的一些业绩,风尊者也是略有所耳闻,但据他据说,这是由于前者体内有着一个强盛灵魂体的缘故 】自从那日小医仙由于仰药而昏迷之后 ,而如今,在这场比试中,却是被雷尊者率先制止应用,如斯一来,却是令得萧炎战斗力大为减弱。 眼光在萧 滚动一下头 炎身上扫了扫,雷尊者可能隐隐觉察到一个壮大灵魂体的存在,但令得他有些扫兴的是,这种灵魂稳定,并非是药老所有。 “警惕一些,】自从那日小医仙由于仰药而昏迷之后,此女实力非同凡响,若我所料不差的话,在经由天山血潭的侵泡后,她也是真正的晋入了斗宗档次,而且再加上她的身份,滚动一下头,战役力更是远超寻常斗宗。””风尊者偏头轻声吩咐道。 “若真是不敌,也不必与其硬抗,凤清儿的夭赋 ”凌雪轻笑 ,的确是我这些年所见的年

  • 摩卡于子

    十年考古 看了那么多篇终于看到畅通无阻一路看懂的了 感谢QwQ

  • CCb2h7

    父亲  我是京东抢购不能下单闻着酒味儿长大的卷皮网 官网1折,小时候我觉得父亲有“把酒问青天”的返 京东抢购不能下单 利宝豪气,父亲或微醉,喋喋不休说些莫名的穿衣搭配的软件下 卷皮网 官网1折 载大道理,或大醉,呕吐不止,母亲每次跟父亲据理力争时,父亲定会大声嚷嚷:我没什么爱好,只爱喝点酒尽兴,有什么不好。母亲说多了聚划算坑位竞拍,心烦了返利通,无奈了美团团购网站,干脆不管,父亲更加逍遥。  我以为父亲就此这样“醉生”下去了聚划算软件。可没想到父亲在gps电波干扰他51岁膀胱癌手术后便一下滴酒不沾,我为此纳闷了很久,如果 返利宝 父亲怕死,人之常情,但不符合父亲的1号店优惠券领取性格,父亲曾多次跟他人说:不就是电子优惠券打印死,命由天注定,该

  • ericshao

    我们jsoi教练强烈推荐看看这篇博文
    果然大牛!

  • CCu6s5

    雨季不再来  近年来几乎不曾去参加任何的雅安体检中心 雅安体检中心 聚会,习惯了安顺体检两点一线的马鞍山体检中心生活,下班回家就是乐山体检坚决闭门不出。有女友暑期回家,打着好久不见的舟山体检旗号催促着我定 安顺体检 个时间照面都被我推三阻四给拒绝了绥化体检中心。也许太孤僻的南阳体检中心人反而喜欢享受一个人恰到好处的安静。  太过热络的友谊需要消耗更多的时间与热情。想到“亲疏随缘,尊重他人”这句话竟是鸡西体检十分贴切。想想距离上一次的聚会好像是鄂尔多斯体检中 马鞍山体检中心 心几年前的事了佛山体检。那么长久一人会不会曾感到无以名状的孤寂?我偶尔会感到恐惧。恐惧的是临沧体检中心自己人际关系如此狭隘紧张和麻痹,甚至会为有一天孤独地死去这一想法给

  • CCm1y7

    父亲的投稿情节  父亲的晋中体检投稿情结  …………木冬叶子  又到父亲节了西双版纳体检中心 晋中体检 ,令我一直难以释怀的 西双版纳体检中心 丹东体检中心是唐山体检中心父亲的呼和浩特体检投稿情结。  也不知道何因,年近八十岁的陇南体检中心父亲不甘淡泊于每天和老友们一起喝茶、聊天、下象棋的生活,而是牡丹江体检中心动手写文章了广安体检中心。  父亲的 丹东体检中心 年代,没有机会读到完整的中学,也不敢奢望读大学中文系或者新闻系,电脑也有些远,不会录入,只是郴州体检靠手写,写了济源体检改,改了无锡体检中心又重抄,反反复复也不惧累,自有乐在台州体检其中,便与投稿结下了不解之缘。  也不知道哪来的动力,几天下来,父亲可以写下几万字的

  • linkfqy

    感谢Matrix67大神,写得太好辣

  • _YPC

    看到了作者的文章之后真的算是对KMP有个较为系统地认识了,作者讲的十分浅显易懂,而且关于介绍失配函数的时候也是十分的简单,感谢作者!

  • wtm

    博主您好!我在《信息学奥赛一本通·提高篇》中关于KMP算法的章节中,发现其直接全文使用了您的博客内容,并未注明出处。请问这是否已经获得了您的授权呢?PS.您的博客对我帮助很大!

  • wtm

    现在觉得这篇神文应该是网络上流传已久的「祖传」「江湖秘笈」了

  • JERRY

    现在可算是考古?>_<

  • 蒟蒻

    考古QAQ

  • zzzzzzzzy

    考古

  • Charming

    考古qwq

  • lot

    2021年第一铲

  • TRUE3494063625

    2021年第二铲

  • Leon

    2022年第一铲

  • wosile

    2022年第二铲

  • xcy

    2024第一铲

发表评论




Enter Captcha Here :