HDU 2222 ac自动机模板

题意:

  求n个模板串在匹配串中出现了几个.

SOL:

  反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同...

  貌似自己的理解和他们画的图还是有些出入......不虚慢慢看...

  然后就是特殊一点的一个last数组,可以比较迅速地找到包含的子串.

  这个题目会出现相同的模板...没看懂老人家开map的意图,第一遍用vector打,然后这种统计数量不是直接开个num记录数量就好了吗...

  然而为毛我的num比开vector还慢呢...

  

/*==========================================================================
# Last modified: 2016-03-02 19:00
# Filename: a.cpp
# Description: 
==========================================================================*/
#define me AcrossTheSky 
#include <cstdio> 
#include <cmath> 
#include <ctime> 
#include <string> 
#include <cstring> 
#include <cstdlib> 
#include <iostream> 
#include <algorithm> #include <set> 
#include <map> 
#include <stack> 
#include <queue> 
#include <vector> #define lowbit(x) (x)&(-x) 
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++) 
#define FORP(i,a,b) for(int i=(a);i<=(b);i++) 
#define FORM(i,a,b) for(int i=(a);i>=(b);i--) 
#define ls(a,b) (((a)+(b)) << 1) 
#define rs(a,b) (((a)+(b)) >> 1) 
#define getlc(a) ch[(a)][0] 
#define getrc(a) ch[(a)][1] #define maxn 1000200
#define maxm 100000 
#define maxc 30
#define pi 3.1415926535898 
#define _e 2.718281828459 
#define INF 1070000000 
using namespace std; 
typedef long long ll; 
typedef unsigned long long ull; template<class T> inline 
void read(T& num) { bool start=false,neg=false; char c; num=0; while((c=getchar())!=EOF) { if(c=='-') start=neg=true; else if(c>='0' && c<='9') { start=true; num=num*10+c-'0'; } else if(start) break; } if(neg) num=-num; 
} 
/*==================split line==================*/
char temp[maxn],s[60];
int ch[500005][maxc],f[500005],last[500005];
vector<int> val[500005];
int sz,ans;
void reset(){	sz=1; ans=0; memset(ch,0,sizeof(ch)); memset(last,0,sizeof(last));memset(val,0,sizeof(val)); memset(f,0,sizeof(f));
}
int idx(char c){return c-'a';}
void insert(char *s,int v){int u=0,len=strlen(s);FORP(i,0,len-1){int c=idx(s[i]);if (!ch[u][c]) {while(val[sz].size()) val[sz].pop_back();ch[u][c]=sz++;}u=ch[u][c];}val[u].push_back(v);
}
void add(int j){while(val[j].size()){ ans+=val[j].size(); while (val[j].size()) val[j].pop_back();j=last[j];}
}
void find(char *T){int n=strlen(T);int j=0;FORP(i,0,n-1){int c=idx(T[i]);j=ch[j][c];if (val[j].size()) add(j);else if(last[j]) add(last[j]);}
}
void getfail(){queue<int>q;f[0]=0;FORP(c,0,maxc-1){int u=ch[0][c];if (u) { f[u]=0; last[u]=0; q.push(u);}}while (!q.empty()){int r=q.front(); q.pop();FORP(c,0,maxc-1){int u=ch[r][c];if (!u) {ch[r][c]=ch[f[r]][c]; continue;}q.push(u);int v=f[r];while (v && !ch[v][c]) v=f[v];f[u]=ch[v][c];last[u]=val[f[u]].size()?f[u]:last[f[u]];}}
}
int main(){int cas; read(cas); while (cas--){ reset();int n; read(n);FORP(i,1,n){scanf("%s",s);insert(s,i);}scanf("%s",temp);getfail();find(temp);printf("%d\n",ans);}
}

 

转载于:https://www.cnblogs.com/YCuangWhen/p/5237322.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下spi添加设备,Linux Kernl添加spidev的设备节点

一、spidev介绍如果在内核中配置spidev&#xff0c;会在/dev目录下产生设备节点&#xff0c;通过此节点可以操作挂载在该SPI总线上的设备。用户空间通过该节点可以访问内核空间。二、配置spidev设备步骤在i.MX6&#xff0c;Kernel 4.1.15上配置spidev的支持。1、配置dts支持spi…

Android studio Jin开发生成so文件的具体步骤

粉丝提问&#xff1a; 博主解答&#xff1a; 帖子链接&#xff1a;https://blog.csdn.net/wangsfine/article/details/51445199

linux中改变文件大小,Linux 改变文件大小的方法

函数原型&#xff1a;#include int ftruncate(int fd, off_t length); //改变文件大小为length指定大小;返回值 执行成功则返回0&#xff0c;失败返回-1。函数ftruncate会将参数fd指定的文件大小改为参数length指定的大小。参数fd为已打开的文件描述词&#xff0c;而且必须是以…

Ubuntu下使用SVN

Ubuntu下使用SVN SVN作为日常开发中不可缺少的工具&#xff0c;今天终于开始在Ubuntu下使用了。 1、首先需要安装SVN。Ubuntu下的SVN安装十分简单&#xff0c;sudo apt-get install subversion&#xff0c;然后根据提示一步一步&#xff0c;就完成了SVN的安装&#xff1b; 2、检…

apktool重新打包,error:No resource identifier found for attribute ‘compileSdkVersionCodename‘ in package

报错日志:AndroidManifes.xml :1 error:No resource identifier found for attribute compileSdkVersionCodename in package ‘android’ 粉丝提问: 报错图: 博主解答:

linux弹性网卡,将弹性网卡附加到 ECS 实例上之后如何配置弹性网卡

本文在介绍将弹性网卡附加到 ECS 实例上之后如何配置弹性网卡的基础上&#xff0c;重点探讨了其具体步骤&#xff0c;本文内容很紧凑&#xff0c;希望大家耐心学习。配置 ECS 实例的弹性网卡如果您的实例使用以下几种镜像&#xff0c;您不需要手工配置弹性网卡(ENI)&#xff1a…

vaadin_嵌入式码头,Vaadin和焊接

vaadin当我开发Web应用程序时&#xff0c;我希望能够从Eclipse快速启动它们&#xff0c;而不必依赖各种重量级的tomcat或glassfish插件。 因此&#xff0c;我经常要做的就是创建一个可以直接从Eclipse直接运行的基于Java的简单Jetty启动器。 该启动器会在几秒钟内启动&#xff…

终端-进入云服务器

解决办法: 1.先进入管理员模式: 2.下一步&#xff0c;链接服务器。 3.已经连接上服务器&#xff1a; 4.找到云服务器的项目路径: 在这里&#xff1a; 我们可以在cd空格/ 按Tab寻找下个文件夹&#xff0c;也可以输入ls查看文件夹。转载于…

Android studio 清除缓存数据的步骤

导读:在eclipse的当中进行运行Android的运用的程序的时候,就会产生内存缓存的信息,而eclipse是可以直接点击停止运行程序,然后点击清除缓存,就可以解决了这个问题,而Android studio却不能直接点击停止运行的,而只能通过其它的方式来清除Android studio中的缓存。 可以看…

linux 函数 文件校验,Linux中的文件效验命令

在网络传输、设备之间转存、复制大文件等时&#xff0c;可能会出现传输前后数据不一致的情况。这种情况在网络这种相对更不稳定的环境中&#xff0c;容易出现。那么校验文件的完整性&#xff0c;也是势在必行的。md5sum命令用于生成和校验文件的md5值&#xff0c;MD5全称报文摘…

为Java应用程序编写数据驱动的测试

JUnit是一个功能非常强大的测试框架&#xff0c;它不仅为其用户提供了编写快速简便的测试的功能&#xff0c;而且还为用户提供了扩展它并使其按其期望的方式工作的机会。 在JUnit之上构建了许多框架&#xff0c;这些框架为目标受众提供了各种易用的功能。 EasyTest是这样一种框…

为《31天成为IT服务达人》征求正式名字

写书时。没细想书的名字&#xff0c;仅仅是在想出本能够让同行或未来同行高速入门的书&#xff0c;如今想来还是应正式给他取个名&#xff0c;请朋友们帮忙哟 转载于:https://www.cnblogs.com/bhlsheji/p/5241848.html

设置按钮5秒后可以点击下一步||5秒后自动关闭网页

场景:业务需要在点击拍摄的时候提示一个用户须知页面,5秒后可以点击下一步。这属于一个js计时器的功能。这里用jQuery实现一下 效果图: html <div style="text-align: center;"><input type="button" value="下一步" id="next…

Codeforces Round #344 (Div. 2) B. Print Check

题意&#xff1a; 给你一个n*m一开始全是0的矩阵&#xff0c;然后又q次询问 每次询问给你三个字母 op,a,b 将第a行变成b 将第a列变成b 然后让你输出Q次询问后&#xff0c;这个矩阵长什么模样 思路&#xff1a;每个格子记录两个状态&#xff0c;区分横竖。 1 #include<cstdio…

linux数据包注释,关于 linux中TCP数据包(SKB)序列号的小笔记

关于 SKB序列号的小笔记为了修改TCP协议&#xff0c;现在遇到了要改动tcp分组的序列号&#xff0c;但是只是在tcp_sendmsg函数中找到了SKB的end_seq 一直没有找到seq不清楚在那里初始化了&#xff0c;就跟踪了分配SKB的函数 sk_stream_alloc_skb()还是没有找到&#xff0c;最…

JSP + Struts + Hibernate + Spring+MySQL+Myeclipse实现固定资产管理系统

导读:随着计算机信息技术的发展以及对资产、设备的管理科学化、合理化的高要求,利用计算机实现设备及资产的信息化管理已经显得非常重要。固定资产管理系统是一个单位不可缺少的部分。但一直以来人们使用传统的人工方式管理固定资产的信息,这种管理方式存在着许多缺点,这对…

java高效复制文件并移动_Java 7:复制和移动文件和目录

java高效复制文件并移动这篇文章是我对Java 7 java.nio.file软件包的系列文章的继续&#xff0c;这次涵盖了文件的复制和移动以及完整的目录树。 如果您曾经对Java缺少copy和move方法感到沮丧&#xff0c;那么请继续阅读&#xff0c;以免麻烦。 涵盖范围中包括非常有用的Files.…

MyEclipse+Tomcat+Java+MySQL实现企业员工信息管理系统

导读:随着信息技术的日益发展已深入到社会的各个角落,各个大的企业,都充分意识到传统的手工管理模式已经逐渐不能适应时代的发展,为了更好的发展,纷纷开发适合自己的管理系统。不管大企业。各种员工信息的小企业也是如此,企业的管理层也深深意识到这一点,以前管理大多为…

T4模板之菜菜鸟篇

一、废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中&#xff0c;“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板&#xff0c;它可以生成文本文件。 在 Visual C# 或 Visual Basic 中&…

linux动态库ppt,LINUX系统中动态链接库创建与使用补充_区块链白皮书代写|市场计划书项目PPT设计_Tbleg...

区块链白皮书代写大家都知道&#xff0c;在WINDOWS系统中有很多动态链接库(以.DLL为后缀文件&#xff0c;DLL即Dynamic Link Library)。这种动态链接库&#xff0c;和静态函数库不同&#xff0c;它里面函数并不是执行程序本身一部分&#xff0c;而是根据执行程序需要按需装入&a…