題目描述
如題,給出兩個字串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。
為了減少騙分的情況,接下來還要輸出子串的字首陣列next。
輸入輸出格式
輸入格式:
第一行為乙個字串,即為s1
第二行為乙個字串,即為s2
輸出格式:
若干行,每行包含乙個整數,表示s2在s1中出現的位置
接下來1行,包括length(s2)個整數,表示字首陣列next[i]的值。
輸入輸出樣例
輸入樣例#1: 複製
abababc
aba
輸出樣例#1: 複製
1 3
0 0 1
說明時空限制:1000ms,128m
資料規模:
設s1長度為n,s2長度為m
對於30%的資料:n<=15,m<=5
對於70%的資料:n<=10000,m<=100
對於100%的資料:n<=1000000,m<=1000000
樣例說明:
所以兩個匹配位置為1和3,輸出1、3
就是kmp的模板
#include
#include
#include
#define n 1000010
int lena,lenb;
char a[n],b[n];
int next[n];
using
namespace
std;
void prepare()
}int main()
}for(int i=1;i<=lena;i++)
cout
<' ';
}
P3375 模板 KMP字串匹配
如題,給出兩個字串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。為了減少騙分的情況,接下來還要輸出子串的字首陣列next。輸入格式 第一行為乙個字串,即為s1 第二行為乙個字串,即為s2 輸出格式 若干行,每行包含乙個整數,表示s2在s1中出現的位置 接下來1行,包括length...
P3375 模板 KMP字串匹配
這道題其實幾周前就已經切掉了,但是偶然間發現自己還沒發部落格,就來補一篇好了。kmp這個東西,網上講得太複雜,其實很簡單,也很容易解釋。就是分為兩部分 先維護next陣列 得先知道對next的定義吧?不知道可以上網查查 利用已經求好的next來計算。提醒一下,注意邊界判斷。不會的可以直接看我的 反正...
題解 P3375 模板 KMP字串匹配
這道題目是比較經典的 kmp 模板,用乙個模式串匹配乙個文字串,輸出全部匹配的位置 首先考慮最暴力的做法 我們從最開始的位置暴力匹配,如果成功,那麼就返回 i j i 是文字串當前的位置,j 是模式串當前的位置 否則,我們就回溯到 i j 1 因為我們開始匹配的位置是 i j 那麼它的下一位就是 i...