博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openOJ 1897 Forbidden Words(自动机)
阅读量:5825 次
发布时间:2019-06-18

本文共 1433 字,大约阅读时间需要 4 分钟。

题目链接:

题意:给出一个串s和一些病毒串。求s的最长不包含病毒的子串。

思路:将病毒串建立自动机,节点保存深度,深度初始化无穷大。每次出现 病毒串的时候从病毒串的第二个位置开始重新计数。

struct node{    int next[26],fail,len;    void init()    {        clr(next,0);        fail=0;        len=INF;    }};node a[N];int e;void insert(char s[]){    int i,k,p=0;    for(i=0;s[i];i++)    {        k=s[i]-'A';        if(a[p].next[k]==0)        {            a[e].init();            a[p].next[k]=e++;        }        p=a[p].next[k];    }    a[p].len=i;}queue
Q;void build(){ int i,j,k,p,q; FOR0(i,26) if(a[0].next[i]) Q.push(a[0].next[i]); while(!Q.empty()) { k=Q.front(); Q.pop(); for(i=0;i<26;i++) { if(a[k].next[i]) { p=a[k].next[i]; q=a[k].fail; Q.push(p); a[p].fail=a[q].next[i]; a[p].len=min(a[p].len,a[a[p].fail].len); } else { q=a[k].fail; a[k].next[i]=a[q].next[i]; } } }}int C;int n,m;char s[N],s1[N];int main(){ RD(C); while(C--) { a[0].init();e=1; RD(n,m); RD(s); while(m--) RD(s1),insert(s1); build(); int ans=0,t=0,i,j,k,L=0; FOR0(i,n) { k=s[i]-'A'; t=a[t].next[k]; j=i+1-a[t].len; if(j>=L) L=j+1; else ans=max(ans,i+1-L); } PR(ans); } return 0;}

  

转载地址:http://qksdx.baihongyu.com/

你可能感兴趣的文章
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
Linux 目录结构及内容详解
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
.net excel利用NPOI导入oracle
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
hive基本操作与应用
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>
Android应用集成支付宝接口的简化
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
django 目录结构修改
查看>>
win8 关闭防火墙
查看>>
CSS——(2)与标准流盒模型
查看>>
MYSQL 基本SQL语句
查看>>
C#中的Marshal
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>