链接   http://acm.fzu.edu.cn/problem.php?pid=2128

解题方法  首先考虑暴力,,就是拿每一个字符串在匹配串里面找到所有位置,然后从头到尾不断更新最长的合理位置pos 同时记录出 最长的长度; 想到这样会超时,所以 AC 自动机一下,找到任意一个后缀最长能匹配的位置 方法是: 在构建自动机的 fail 指针的时候,找到任意位置的任意字符最长公共前缀的时候看那个位置是否有单词存在;

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; struct date{
date *next[26],*fail;
int len; bool flag;
}tree[100005],*que[100005],*root;
int N,total,tail,hed; char str[1000006],cha[102];
date *creat( )
{
for( int i = 0; i < 26; i++ )
tree[total].next[i] = NULL;
tree[total].fail = NULL;
tree[total].flag = false;
tree[total].len = 1000000;
return &tree[total++];
}
void inint( )
{
total = hed = tail = 0;
root = creat();
root->fail = root;
}
void insert( char *word,int len )
{
date *temp = root;
while( *word )
{
int num = *word - 'a';
if( temp->next[num] == NULL )
temp->next[num] = creat();
temp = temp->next[num];
word++;
}
temp->len = len-1;
temp->flag = true;
}
void build( )
{
que[tail++] = root;
while( tail > hed )
{
date *temp = que[hed++];
for( int i = 0; i < 26; i++ )
if( temp->next[i] != NULL ){
if( temp == root )temp->next[i]->fail = root;
else temp->next[i]->fail = temp->fail->next[i];
if( temp->fail->next[i]->flag )
temp->next[i]->len = min( temp->next[i]->len,temp->fail->next[i]->len );
que[tail++] = temp->next[i];
}
else {
if( temp == root )temp->next[i] = root;
else temp->next[i] = temp->fail->next[i];
}
}
}
short int res[1000006];
inline int max( int a,int b){return a>b?a:b;}
inline int min( int a,int b){return a>b?b:a;}
void search( char *word )
{
int t = 0; date *temp = root; int len = strlen(word);
while( *word )
{
int num = *word - 'a';
temp = temp->next[num];
res[t] = temp->len;
word++; t++;
}
int pre = 0; int Max = 0;
for( int i = 0; i < len; i++ ){
pre = min( pre + 1,res[i] );
Max = max( Max,pre );
}
printf("%d\n",Max);
}
int main( )
{
while( scanf("%s",&str) != EOF )
{
scanf("%d",&N); inint( );
for( int i = 1; i <= N; i++ ){
scanf("%s",&cha); insert(cha,strlen(cha));
}
build( ); search( str );
}
return 0;
}

  

fzu 2128 AC自动机的更多相关文章

  1. fzu 2246(ac 自动机)

    fzu 2246(ac 自动机) 题意: 某一天YellowStar学习了AC自动机,可以解决多模式匹配问题.YellowStart当然不会满足于此,它想进行更深入的研究. YellowStart有一 ...

  2. HDU 3341 Lost's revenge AC自动机+dp

    Lost's revenge Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)T ...

  3. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  4. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  5. python爬虫学习(11) —— 也写个AC自动机

    0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...

  6. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  7. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

  8. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  9. [AC自动机]【学习笔记】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...

随机推荐

  1. C# 给数据库传入当前时间

    DateTime time=DateTime.Now; // 存储过程中用一个 @addTime DateTime --接收DateTime 类型接收

  2. [转载] select, poll和epoll的区别

    源地址:http://sheepxxyz.blog.163.com/blog/static/61116213201022003513530/ 随着2.6内核对epoll的完全支持,网络上很多的文章和示 ...

  3. hdu 2413(最大匹配+二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2413 思路:由于要求最少的时间,可以考虑二分,然后就是满足在limit时间下,如果地球战舰数目比外星战 ...

  4. ADs系列之通用数据解析服务GAS(即将开源)

    面对成百上千的生产系统用户操作数据接入落地,你是否厌倦了每次机械编写打包解包的代码?对一次性接入多个数据的时候,还要对不同人联调,费时费力,你是否还会手忙脚乱,忙中不断出错?是否当数据出问题了,用的时 ...

  5. Hadoop基础教程之高级编程

    从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成<key, value>. 2 ...

  6. iOS 开发--多线程

    前面在<Bison眼中的iOS开发多线程是这样的(二)>一文中讲完了多线程的NSThread,不难发现这种方式的多线程实现起来非常的复杂,为了简化多线程的开发,iOS提供了GCD来实现多线 ...

  7. 312. Burst Balloons

    题目: Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented ...

  8. highCharts图表入门实例

    本文通过讲解Highcharts生成一个简单的3D柱状图实例来学习Highcharts的使用. JSP 页面 1.需要引入的js文件 <script src="<%=basePa ...

  9. ubuntu下安装与测试mysql

    1.在决定安装mysql之前,要先确定系统是否已经安装mysql. 输入: 1 mysql 结果:说明尚未安装mysql The program 'mysql' is currently notins ...

  10. Hibernate 异常 —— Unable to instantiate default tuplize

    出现这个异常 —— Unable to instantiate default tuplizer ,是 Hibernate 的映射文件(*.hbm.xml)导致的.仔细检查一下工程里的映射文件吧. 笔 ...