SCU 4438 Centor(審査員)(KMPアルゴリズムと模擬スタックの応用𞓜HASH表と模擬スタックの結合)
6010 ワード
Center
froog is now a editor to censor so-caled sensitive words(敏感語)
She has a long text pp.Her job is relatively simple--just to find the first occurence of sensitive word ww and remove it.
froog repeat over and over again.Help her do the tedious work.
フレッグは現在編集員で、いわゆる河蟹語を専門に審査しています.
彼は今長いテキストpを持っています.彼の仕事は比較的簡単です.
フレッグは何度も繰り返して、彼にこのつまらない任務を完成させるように手伝います.
Input
The input consists of multile tests.For each test:
複数のグループのデータを含むグループを入力します.
The first line contains 11 ストリングス ww.The second line contains 11 ストリングス pp.
最初の行は文字列Wを含み、2行目は文字列Pを含む.
(1≦length of w、p≦5⋅1061≦length of w、p≦5⋅106、 w,pw,p consists of only lowercase letter)
Output
For each test,write 11 string which denotes the censored text.
テストサンプルごとに文字列を出力します.河蟹になったテキストを表します.
Sample Input
abc
aaabcbc
b
bbb
abc
ab
Sample Output a
ab
この問題を見たばかりの時は、テキストを削除した後のテキストは前に従って削除テキストの位置に移動します.Pythonのダイナミックメモリ管理に似ています.最初の考えはkmp+vectorですが、SCUOJで1986 msの高評価を得ました.Caution:本題のデータが小さいので、stingタイプとcin、cout、stl-stack(純C時間200~400 ms、C with STL and iostream時間1000~140 ms、時間制限1500 ms)を慎重に使う
KMP+アナログスタック
プログラムの実現にはテキストを中断する必要がありますので、キーワードを削除する目的を達成しました.スタックというデータ構造はちょうど私達の要求を満たすことができます.kmpアルゴリズムで対応する文字列にマッチしながら、元の文字列を徐々にスタックに押し込みます.マッチングしたら、マッチングした文字列を全体的にスタックから引っ張り出して、「削除」の効果を実現しました.マッチングは成功文字列の最後尾の文字にマッチしてから続けられますので、このプロセスは「自動接続」を満足させます.の効果です
考えを簡単に述べる
#include
#include
#include
#include
#include
#include
#include
#include
#define DETERMINATION main
#define lldin(a) scanf("%lld",&a)
#define din(a) scanf("%d",&a)
#define printlnlld(a) printf("%lld
",a)
#define printlnd(a) printf("%d
",a)
#define printlld(a) printf("%lld",a)
#define printd(a) printf("%d",a)
#define reset(a,b) memset(a,b,sizeof(a))
const int INF=0x3f3f3f3f;
using namespace std;
const double PI=acos(-1);
typedef long long ll;
typedef long double ld;
const int mod=1000000007;
///Schlacht von Stalingrad
/**Although there will be many obstructs ahead,
the desire for victory still fills you with determination..**/
char text[7650000],key[7650000];
int next2[7650000],tmp[7650000];
ll indice;//
char impersonated[7650000];//
void generator()//next ,
( ) 。
{
ll ph=-1,pt=0;
next2[0]=-1;
ll klen=strlen(key);
while(pt0&&key[pk]!=text[pt])
pk=next2[pk];//
if(key[pk]==text[pt])
pk++;//
tmp[indice]=pk;// , next .
// cout<
HASH表+アナログスタック私達はすべてhash表がKEY-VALE類のデータ構造であることを知っています.キーの値を把握すれば、私達はこのキーの指す内容にアクセスできます.対応してキーの値が間違っていたら、私達は自然に正しい内容にアクセスできません.
大体次の通りです.
#include
#include
#include
#include