P3375 模板 KMP字串匹配

2022-05-24 07:09:08 字數 787 閱讀 5530

這道題其實幾周前就已經切掉了,但是偶然間發現自己還沒發部落格,就來補一篇好了。

kmp這個東西,網上講得太複雜,其實很簡單,也很容易解釋。

就是分為兩部分:

先維護next陣列(得先知道對next的定義吧?不知道可以上網查查)

利用已經求好的next來計算。

提醒一下,注意邊界判斷。

不會的可以直接看我的**,反正很短,理解了定義,直接看**就不會是問題。

**如下:

#include#include

using

namespace

std;

#define maxn 1000005

char

s[maxn],t[maxn];

intnext[maxn],sum[maxn];

intmain()

else

}if(t[r+1]==t[i])

r=next[r];

}next[i]=r;

}for(int c=1; c<=ss; c++)

}for(int i=1;i<=ans;i++)

printf(

"%d\n

",sum[i]);

for(int i=1; i<=tt; i++)

printf(

"%d

",next[i]);

return0;

}

如果你還沒看懂,再去看看有關陣列的定義,稀里糊塗不懂原理是學不好的。

當然,我的方法可能有點笨,也請多包涵。

P3375 模板 KMP字串匹配

題目描述 如題,給出兩個字串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。為了減少騙分的情況,接下來還要輸出子串的字首陣列next。輸入輸出格式 輸入格式 第一行為乙個字串,即為s1 第二行為乙個字串,即為s2 輸出格式 若干行,每行包含乙個整數,表示s2在s1中出現的位置 接下...

P3375 模板 KMP字串匹配

如題,給出兩個字串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。為了減少騙分的情況,接下來還要輸出子串的字首陣列next。輸入格式 第一行為乙個字串,即為s1 第二行為乙個字串,即為s2 輸出格式 若干行,每行包含乙個整數,表示s2在s1中出現的位置 接下來1行,包括length...

題解 P3375 模板 KMP字串匹配

這道題目是比較經典的 kmp 模板,用乙個模式串匹配乙個文字串,輸出全部匹配的位置 首先考慮最暴力的做法 我們從最開始的位置暴力匹配,如果成功,那麼就返回 i j i 是文字串當前的位置,j 是模式串當前的位置 否則,我們就回溯到 i j 1 因為我們開始匹配的位置是 i j 那麼它的下一位就是 i...