演算法模板 KMP字串匹配

2022-01-10 23:17:20 字數 1314 閱讀 9327

功能:輸入乙個原串,再輸入n個待匹配串,在待匹配串中找出全部原串的起始位置

原理:kmp演算法,其實這個東西已經包含了ac自動機的思想(fail指標/陣列),只不過適用於單模板匹配,不過值得一提的是在單模板大量匹配待匹配串時,這個會有相當大的優勢,ac自動機雖然好想一些,但是在這一類問題上的價效比就略低了

1

var2

i,j,k,l,m,n:longint;

3 a:array[0..100000] of

longint;

4s1,s2:ansistring;

5begin

6readln(s1);

7 a[1]:=0;8

for i:=2

to length(s1) do

9begin

10 j:=a[i-1

];11

while (j>0) and (s1[j+1]<>s1[i]) do j:=a[j];

12if s1[j+1]=s1[i] then a[i]:=j+1

else a[i]:=0;13

end;

14readln(n);

15for l:=1

to n do

16begin

17readln(s2);

18 j:=0;19

for i:=1

to length(s2) do

20begin

21inc(j);

22if s1[j]=s2[i] then

23begin

24if j=length(s1) then

25begin

26 write(i-length(s1)+1,'');

27 j:=a[j];

28end;29

end30

else

31begin

32 j:=j-1;33

while (j>0) and (s1[j+1]<>s2[i]) do j:=a[j];

34if s1[j+1]=s2[i] then inc(j) else j:=0;35

end;

36end;37

writeln;

38end;39

readln;

40end

.41

模板 kmp字串匹配

題目 kmp字串匹配 資料 syc大佬的部落格 思路 nxt i 字串0 i的最長相等的字首字尾長減1,也就是最長相等字首字尾中的字首的結束位置。比如從i開始查詢到j處時不匹配,nxt j 2,也就是說a段和b段完全相等,因為a是x串的字首,那麼b也是x串的字首,可以直接從b段開始匹配 i j xx...

模板 KMP字串匹配

顧名思義,就是一種用來進行字串匹配的演算法。這種演算法的核心就是乙個nxt陣列,表示在模式串的第i位失配後,應該跳到模式串的哪一位繼續匹配。為什麼要這樣?顯然,因為文字串是不確定的,所以在匹配的時候的nxt陣列肯定是按照模式串建的。其次,為什麼要設乙個nxt陣列呢?模 式串 abc ab c模式串 ...

模板 KMP字串匹配

題目鏈結 給出兩個字串 s1 和 s2,若 s1 的區間 l,r 子串與 s2 完全相同,則稱 s2 在 s1 現了,其出現位置為 l。現在請你求出 s2 在 s1 中所有出現的位置。定義乙個字串 s 的 border 為 s 的乙個非 s 本身的子串 t,滿足 t 既是 s 的字首,又是 s 的字...