KMP 差分 文章過濾器 filter

2022-05-27 16:15:13 字數 1264 閱讀 3998

給定一些短串,要求你在乙個長串中,將這些短串部分變為\(*\)

第一行包括乙個整數\(n\),表示短串的數量.

接下來的\(n\)行,為\(n\)個短串.

最後一行,為你需要變化的長串.

一行,表示變化後的長串.

ps:長串會有中有各種字元,短串僅包含英文本元

inting

kitty

int is interesting! ~owo~

\(***\) is \(***\)erest\(***\)ing! ~owo~

上面的一些輸入輸出中為全形,實際上為半形.

這題做法有很多啊,可以雜湊,可以ac自動機,可以kmp.

這裡講一下kmp演算法.

做法為\(kmp+\)差分.

首先需要將長串中的字母全部轉為小寫(大寫).

\(isalpha\)吼啊

我們對每乙個短串求出其\(next\)陣列.再列舉這些串去和長串匹配.

但是一些位置會出問題.

比如

給定兩個短串為\(gre\)和\(eat\),長串為\(great\)

則我們的長串要變成\(*****\)

因此引入了差分.

如果匹配上之後,我們直接對其左端點和右端點\(+1\)差分。

最終列舉的話,直接判斷有無標記,如果有,則將當前位置變為\(*\)

然後直接輸出即可.

**

#include#include#include#define r register

using namespace std;

char sta[150008],stb[150008];

int pos[150008],k,n,len;

struct cod

str[55];

char st[55],c;

inline char ch(char s)

int main()

} getchar();

while(c!='\n')

for(r int i=1;i<=n;i++)

}} for(r int i=1;i<=len;i++) }

/*2gre

eatgreat britain

***** britain

*/

傳說中差分kmp

codeforces 471d 題意 你建造了一堵牆,這堵牆是由n個塔組成的,每個塔相互連線,且各自有乙個高度,你給你自己的牆起了乙個名字,叫大象。豬也建造了一堵牆。問你最多能從豬建的牆中找到幾個大象。你可以將你自己的牆中的塔向上提公升,或者下降,可以降到地下。解析 開始題意沒有理解。不是你對牆做任...

棧和堆之間的差(他轉身無數的文章)

一 預賽 該方案的記憶體分配 由c c 下面的編譯器的記憶體使用部分 1 堆疊區 stack 通過分配上發布自己主動編譯 存放函式的引數值。區域性變數的值等。其 操作方式相似於資料結構中的棧。2 堆區 heap 一般由程式猿分配釋放,若程式猿不釋放,程式結束時可能由os回 收 注意它與資料結構中的堆...