fzu 2128 AC自动机
链接 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自动机的更多相关文章
- fzu 2246(ac 自动机)
fzu 2246(ac 自动机) 题意: 某一天YellowStar学习了AC自动机,可以解决多模式匹配问题.YellowStart当然不会满足于此,它想进行更深入的研究. YellowStart有一 ...
- 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 ...
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- AC自动机-算法详解
What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...
- python爬虫学习(11) —— 也写个AC自动机
0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- [AC自动机]【学习笔记】
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
随机推荐
- JSONObject 包的依赖
commons-lang.jar commons-beanutils.jar commons-collections.jar commons-logging.jar ezmorph.jar json- ...
- MySQL Date 函数
MySQL Date 函数 下面的表格列出了 MySQL 中最重要的内建日期函数: 函数 描述 NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 ...
- (9)nehe教程3--添加颜色
添加颜色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在左图中,三角形用的是光滑着色,四边形用的是平面着色. 上一课中我教给您三角形和四边形的绘制方法.这一课我将教您给三角形和四边 ...
- 在 eclipse 中设置每行的字数
在Preferences中:Java Code Style Formatter
- lintcode:线段树的查询
线段树的查询 对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值. 为Segmen ...
- SVN与CVS的区别大全(转载)
本节讲解SVN与CVS的区别,主要包括是否更好的冲突标识与处理,是否有更多的本地/离线操作以及元数据管理问题. 更好的冲突标识与处理 通过是否进行更好的冲突标识与处理看SVN与CVS的区别:C ...
- OpenSSL 使用 base64 编码/解码
简述 关于 OpenSSL 的介绍及安装请参见:Windows下编译OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #incl ...
- MyBatis学习总结_02_使用MyBatis对表执行CRUD操作
一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0&q ...
- SSIS ->> Script Debugging and Troubleshooting
Breakpoint是调试过程中最重要的手段,不仅对于Script Task和Script Component,对于任何其他的组件也是如此.可以在某个Event(如OnError)触发的时候设置断点来 ...
- [原]Water Water Union-Find Set & Min-Spanning Tree Problems' Set~Orz【updating...】
[HDU] 1213 - How Many Tables [基础并查集,求父节点个数] 1856 -More is better [基础并查集,注意内存,HDU数据水了,不用离散化,注意路径压缩的方式 ...