洛谷P3375 模板 KMP字串匹配

2021-09-08 13:41:08 字數 1357 閱讀 6242

如題,給出兩個字串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。

為了減少騙分的情況,接下來還要輸出子串的字首陣列next。

輸入格式:

第一行為乙個字串,即為s1(僅包含大寫字母)

第二行為乙個字串,即為s2(僅包含大寫字母)

輸出格式:

若干行,每行包含乙個整數,表示s2在s1**現的位置

接下來1行,包括length(s2)個整數,表示字首陣列next[i]的值。

輸入樣例#1: 

複製

abababc

aba

輸出樣例#1: 

複製

1

30 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好理解的多

把b串做成乙個hash值

在a串中不斷的匹配就好

時間複雜度:o(n)o(n)

1 #include2 #include3 #include4

#define ull unsigned long long

5using

namespace

std;

6const

int maxn=2e7+10;7

const

int mod=19260817;8

const

int seed=233;9

ull po[maxn];

10 ull hash(ull *a,int l,int

r)11

15char

s1[maxn],s2[maxn];

16ull h1[maxn],h2;

17int

l1,l2;

18int

nxt[maxn];

19int

main()

20//

題目中說要輸出nxt陣列

38for(int i=0;i"

%d "

,nxt[i]);

39return0;

40 }

洛谷 P3375 模板 KMP字串匹配

題目大意 給出n長的字串s1,m長的字串s2,求出s2在s1中所有出現的位置。用kmp做,先輸入每一次s2出現的位置,然後輸出s2的字首陣列next。題解 kmp next i 表示需要匹配的字串的最長公共前字尾的長度。怎麼求next i 呢?首先初值next 1 0,j 0 對於每乙個如果s2 j...

洛谷 P3375 模板 KMP字串匹配

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

洛谷 P3375 模板 KMP字元匹配

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