功能:輸入乙個原串,再輸入n個待匹配串,在待匹配串中找出全部原串的起始位置
原理:kmp演算法,其實這個東西已經包含了ac自動機的思想(fail指標/陣列),只不過適用於單模板匹配,不過值得一提的是在單模板大量匹配待匹配串時,這個會有相當大的優勢,ac自動機雖然好想一些,但是在這一類問題上的價效比就略低了
1var2
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 的字...