算法模板——KMP字符串匹配

功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置

原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单模板大量匹配待匹配串时,这个会有相当大的优势,AC自动机虽然好想一些,但是在这一类问题上的性价比就略低了

 1 var
 2    i,j,k,l,m,n:longint;
 3    a:array[0..100000] of longint;
 4    s1,s2:ansistring;
 5 begin
 6      readln(s1);
 7      a[1]:=0;
 8      for i:=2 to length(s1) do
 9          begin
10               j:=a[i-1];
11               while (j>0) and (s1[j+1]<>s1[i]) do j:=a[j];
12               if s1[j+1]=s1[i] then a[i]:=j+1 else a[i]:=0;
13          end;
14      readln(n);
15      for l:=1 to n do
16          begin
17               readln(s2);
18               j:=0;
19               for i:=1 to length(s2) do
20                   begin
21                        inc(j);
22                        if s1[j]=s2[i] then
23                           begin
24                                if j=length(s1) then
25                                    begin
26                                         write(i-length(s1)+1,' ');
27                                         j:=a[j];
28                                    end;
29                           end
30                        else
31                            begin
32                                 j:=j-1;
33                                 while (j>0) and (s1[j+1]<>s2[i]) do j:=a[j];
34                                 if s1[j+1]=s2[i] then inc(j) else j:=0;
35                            end;
36                   end;
37               writeln;
38          end;
39      readln;
40 end.
41                    

 

转载于:https://www.cnblogs.com/HansBug/p/4271316.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值