PTAブラシ問題のKMPアルゴリズム--自分の粗浅な理解を記録する

1068 ワード


出典はPTAの問題で、最初はKMPアルゴリズムでやろうと思っていましたが、そんなに難しくないことに気づきました.普通の論理処理でいいです.
次のトピックについて説明します.
L 1-0586がひっくり返った(15点)
 
「666」はネット用語で、ある人がすごい、私たちが感心しているという意味だろう.最近また別の数字の“9”を派生して、意味は“6がひっくり返しました”で、本当にすごい意味です.これがすごい最高境界だと思ったら、それは間違っています.現在の最高境界は数字「27」です.これは3つの「9」だからです.
この問題はあなたにプログラムを書いてもらい、それらの時代遅れで、一連の「6666......6」で憧れを表す文を、最新の高級表現に翻訳してください.
入力形式:
入力は、1000文字以下の英字、数字、スペースからなる非空の文字列で、車に戻って終了します.
出力フォーマット:
左から右に入力した文をスキャンします.文の中に3つ以上の連続した6がある場合は、この連続した6を9に置き換えます.しかし、9個以上の連続する6がある場合、この連続する6を27に置き換える.その他の内容は影響を受けず、そのまま出力します.
サンプルを入力:
it is so 666 really 6666 what else can I say 6666666666

出力サンプル:
it is so 666 really 9 what else can I say 27

KMPのアルゴリズムの出所はただ紹介しただけで、関連する文章もたくさんあって、以下私はコードを結びつけて私の自分の構想を話して、この文章を読んだ人に対してもっと理解を深めることを望みます
void GetNext(string str,int next[])/next下付き文字0からint i=0,j=-1;next[0]=-1;while(i{if(j=-1|str[i]=+str[j]){++i;++j;next[i]=j;        }         else             j = next[j];     } }
まずnext配列の役割を説明すると,next[i]の値は主列が移動するビット数を表す.