• AC自动机(简单版)(施工ing)


    声明


     

      想看加强版的戳这里(施工ing,作者正努力中)~

      先贴题目吧哎~   AC自动机加强版  洛谷 P3796


      题目: 洛谷 P3808 (数据范围困了我好久 TAT)

      反正涉及字符串的算法都很玄学,此模板不例外,能用到此模板的都至少 省选+  了。

      

      所需知识点:KMP、Trie。


      由于本人比较无能,忘了以前怎么理解的(包括 KMP 和 Trie),完全忘了,只找到模板,只会套用,等我理解了再来补坑吧!!~

      实在要看思路的这里有传送门:洛谷日报 44 期


      

      只贴标程(以后再补,一个模板贼长了):

            
      1 type
      2         node=record
      3                 sum,failed:longint;
      4                 son:array ['a'..'z'] of longint;
      5         end;
      6 var
      7         t:array [0..1000001] of node;
      8         d,v:array[0..1000001] of longint;
      9         s:array[0..1000001] of char;
     10         n,len,tot,ans,i:longint;
     11 procedure insert;
     12 var
     13         root,i:longint;
     14 begin
     15         root:=0;
     16         for i:=1 to len do
     17         begin
     18                 if t[root].son[s[i]]=0 then
     19                 begin
     20                         inc(tot);
     21                         t[tot].failed:=-1;
     22                         t[root].son[s[i]]:=tot;
     23                 end;
     24                 root:=t[root].son[s[i]];
     25         end;
     26         inc(t[root].sum);
     27 end;
     28 procedure bfs;
     29 var
     30         h,r,now,s,f:longint;
     31         ch:char;
     32 begin
     33         h:=1;
     34         r:=2;
     35         while h<r do
     36         begin
     37                 now:=d[h];
     38                 for ch:='a' to 'z' do
     39                 begin
     40                         s:=t[now].son[ch];
     41                         if s<>0 then
     42                         begin
     43                                 f:=t[now].failed;
     44                                 while (f<>-1) and (t[f].son[ch]=0) do
     45                                         f:=t[f].failed;
     46                                 if f=-1 then t[s].failed:=0
     47                                         else t[s].failed:=t[f].son[ch];
     48                                 d[r]:=s;
     49                                 inc(r);
     50                         end;
     51                 end;
     52                 inc(h);
     53         end;
     54 end;
     55 procedure AC_Automaton;
     56 var
     57         i,now,k,x:longint;
     58 begin
     59         i:=1;
     60         now:=0;
     61         while i<=len do
     62         begin
     63                 k:=t[now].son[s[i]];
     64                 if k<>0 then
     65                 begin
     66                         x:=k;
     67                         while (v[x]=0) and (x<>0) do
     68                         begin
     69                                 v[x]:=1;
     70                                 inc(ans,t[x].sum);
     71                                 x:=t[x].failed;
     72                         end;
     73                         now:=k;
     74                         inc(i);
     75                 end else
     76                 begin
     77                         x:=now;
     78                         while (x<>-1) and (t[x].son[s[i]]=0) do
     79                                 x:=t[x].failed;
     80                         now:=x;
     81                         if now=-1 then
     82                         begin
     83                                 now:=0;
     84                                 inc(i);
     85                         end;
     86                 end;
     87         end;
     88 end;
     89 begin
     90         readln(n);
     91         t[0].failed:=-1;
     92         for i:=1 to n do
     93         begin
     94                 len:=0;
     95                 while not eoln do
     96                 begin
     97                         inc(len);
     98                         read(s[len]);
     99                         if not (s[len] in ['a'..'z']) then
    100                         begin
    101                                 dec(len);
    102                                 break;
    103                         end;
    104                 end;
    105                 readln;
    106                 insert;
    107         end;
    108         bfs;
    109         len:=0;
    110         while not eoln do
    111         begin
    112                 inc(len);
    113                 read(s[len]);
    114                 if not (s[len] in ['a'..'z']) then
    115                 begin
    116                         dec(len);
    117                         break;
    118                 end;
    119         end;
    120         readln;
    121         AC_Automaton;
    122         writeln(ans);
    123 end.
    AC_Automaton
  • 相关阅读:
    php中的高危函数
    PHP 站点相对包含,路径的问题解决方法(include,require)
    PHP中::、-&gt;、self、$this操作符的区别
    C#常用类库(100多个)
    Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
    转载:Android调用相册、拍照实现缩放、切割图片
    在浏览器上直接输入url 时,中文传参乱码问题
    一个asp采集程序
    c#微信开发 转
    如何使用JS来检测游览器是什么类型,或android是什么版本号- 转载
  • 原文地址:https://www.cnblogs.com/t-s-y/p/10325004.html
Copyright © 2020-2023  润新知