這道題其實幾周前就已經切掉了,但是偶然間發現自己還沒發部落格,就來補一篇好了。
kmp這個東西,網上講得太複雜,其實很簡單,也很容易解釋。
就是分為兩部分:
先維護next陣列(得先知道對next的定義吧?不知道可以上網查查)
利用已經求好的next來計算。
提醒一下,注意邊界判斷。
不會的可以直接看我的**,反正很短,理解了定義,直接看**就不會是問題。
**如下:
#include#includeusing
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...