1.HDU 2222 Keywords Search

求目标串中出现了几个模式串。

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define MSE(a,b) memset(a,b,sizeof(a))
#define REN(x) for(ted*e=fch[x];e;e=e->nxt)
#define REP(i,s,t) for(int i=s,__=t;i<=__;i++)
#define DWN(i,s,t) for(int i=s,__=t;i>=__;i--)
using namespace std;
const int maxn=+,inf=-1u>>,sig=;
struct node{node*tx[sig],*fail;int cnt;}ac[maxn],*nodecnt=ac,*root;
node*get(node*&x){return x?x:root;}node*tran(node*x,int&c){while(x&&!x->tx[c])x=x->fail;return get(get(x)->tx[c]);}
void initac(){
for(node*x=ac;x!=nodecnt;x++){
MSE(x->tx,NULL);x->fail=NULL;x->cnt=;
}nodecnt=ac;root=nodecnt++;return;
}
void insert(char*s){
node*x=root;for(int i=;s[i];i++){int c=s[i]-'a';
if(!x->tx[c])x->tx[c]=nodecnt++;x=x->tx[c];
}x->cnt++;return;
}
void getfail(){
queue<node*>Q;REP(c,,sig-)if(root->tx[c])Q.push(root->tx[c]);
while(!Q.empty()){node*x=Q.front();Q.pop();
REP(c,,sig-)if(x->tx[c])x->tx[c]->fail=tran(x->fail,c),Q.push(x->tx[c]);
}return;
}
int find(char*s){
node*x=root;int ans=;for(int i=;s[i];i++){int c=s[i]-'a';
x=tran(x,c);ans+=x->cnt;x->cnt=;node*p=x->fail;while(p)ans+=p->cnt,p->cnt=,p=p->fail;
}return ans;
}
inline int read(){
int x=;bool sig=true;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=false;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';return sig?x:-x;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=;static int buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
char s[maxn];int n,T;
int main(){
T=read();while(T--){
initac();n=read();REP(i,,n)scanf("%s",s),insert(s);
getfail();scanf("%s",s);write(find(s));ENT;
}
return ;
}

2.hiho 1036 Trie图

是否含有模式串

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define MSE(a,b) memset(a,b,sizeof(a))
#define REN(x) for(ted*e=fch[x];e;e=e->nxt)
#define REP(i,s,t) for(int i=s,__=t;i<=__;i++)
#define DWN(i,s,t) for(int i=s,__=t;i>=__;i--)
using namespace std;
const int maxn=+,inf=-1u>>,sig=;
struct node{node*tx[sig],*fail;int cnt;}ac[maxn],*nodecnt=ac,*root;
node*get(node*&x){return x?x:root;}node*tran(node*x,int&c){while(x&&!x->tx[c])x=x->fail;return get(x);}
void initac(){
for(node*x=ac;x!=nodecnt;x++){
MSE(x->tx,NULL);x->fail=NULL;x->cnt=;
}nodecnt=ac;root=nodecnt++;return;
}
void insert(char*s){
node*x=root;for(int i=;s[i];i++){int c=s[i]-'a';
if(!x->tx[c])x->tx[c]=nodecnt++;x=x->tx[c];
}x->cnt++;return;
}
void getfail(){
queue<node*>Q;REP(c,,sig-)if(root->tx[c])Q.push(root->tx[c]);
while(!Q.empty()){node*x=Q.front();Q.pop();
REP(c,,sig-)if(x->tx[c]){
node*p=tran(x->fail,c);x->tx[c]->fail=get(p->tx[c]);
if(p->tx[c]&&p->tx[c]->cnt)x->tx[c]->cnt+=p->tx[c]->cnt;Q.push(x->tx[c]);
}
}return;
}
bool find(char*s){
node*x=root;int ans=;for(int i=;s[i];i++){int c=s[i]-'a';
x=get(tran(x,c)->tx[c]);if(x->cnt)return true;//node*p=x->fail;while(p){if(p->cnt)return true;p=p->fail;}
}return false;
}
inline int read(){
int x=;bool sig=true;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=false;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';return sig?x:-x;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=;static int buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
char s[maxn];int n,T;
int main(){
initac();n=read();REP(i,,n)scanf("%s",s),insert(s);
getfail();scanf("%s",s);puts(find(s)?"YES":"NO");
return ;
}

AC+DP练习的更多相关文章

  1. hdu2825Wireless Password(ac+dp)

    链接 状压dp+ac dp[i+1][next[j]][st|tt]表示第i+1长度结点为next[j]状态为st|tt的时候的ans; dp[i+1][next[j]][st|tt]+=dp[i][ ...

  2. BZOJ_1030_[JSOI2007]_文本生成器_(AC自动机+DP)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1030 给出一些单词,问长度为\(m\)的文章有多少文章中出现过任意一个或多个单词. 分析 文章 ...

  3. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

  4. HUNAN 11569 Just Another Knapsack Problem(AC自动机+dp)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11569&courseid=0 给出目标串,每个子串和 ...

  5. 哈理工新生赛 马拉车+贪心 最大密度子图 AC自动机+DP

    J.Symmys Time Limit: 1000 MS Memory Limit: 262144 K Total Submit: 50 (13 users) Total Accepted: 2 (2 ...

  6. [JSOI2009]密码 [AC自动机]

    题面 bzoj luogu 首先看到这题就知道随便暴枚 只要是多项式算法都能过 先常规建AC自动机 注意被别的单词包含的单词没有存在的价值 剩余单词状压 大力dp f[长度][节点编号][状态] \( ...

  7. 沉迷AC自动机无法自拔之:[UVALive 4126] Password Suspects

    图片加载可能有点慢,请跳过题面先看题解,谢谢 一看到这么多模式串就非常兴奋,又是\(AC\)自动机 题目就是要求:经过 \(n\) 个节点,把所有单词都遍历一遍的方案数,和那道题差不多嘛 所以这样设: ...

  8. 沉迷AC自动机无法自拔之:穿越广场 square

    如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 穿越广场 [问题描述] L 国的仪仗队要穿越首都广场了.首都广场可以看做是一块 N*M 的矩形网格,仪仗队 ...

  9. 51nod1254 最大子段和 V2 DP

    ---题面--- 题解: 表示今天做题一点都不顺.... 这题也是看了题解思路然后自己想转移的. 看的题解其实不是这道题,但是是这道题的加强版,因为那道题允许交换k对数. 因为我们选出的是连续的一段, ...

随机推荐

  1. [转] 用实例给新手讲解RSA加密算法

    http://www.cfca.com.cn/zhishi/wz-012.htm PS: 通常公钥对数据加密,私钥对数据解密:私钥对数据签名,公钥对数据签名进行认证 RSA加密算法是最常用的非对称加密 ...

  2. [转] Linux抓包工具tcpdump详解

    http://www.ha97.com/4550.html PS:tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具.tcpdump凭借强大的功能和灵活的截取策略,使 ...

  3. Android性能优化典范 - 第5季

    这是Android性能优化典范第5季的课程学习笔记,拖拖拉拉很久,记录分享给大家,请多多包涵担待指正!文章共10个段落,涉及的内容有:多线程并发的性能问题,介绍了AsyncTask,HandlerTh ...

  4. java读取redis的timeout异常

    http://blog.csdn.net/shuaiokshuai/article/details/23266091 FIFO Fist-in Fisrt-out 先进先出

  5. 第七篇: python高级之多线程

    21 interest=0.05 22 count=amount+amount*interest 23 24 self.withdraw(count) 25 26 27 def transfer(_f ...

  6. CakePHP之请求与响应对象

    请求与响应对象 请求与响应对象在 CakePHP 2.0 是新增加的.在之前的版本中,这两个对象是由数组表示的,而相关的方法是分散在RequestHandlerComponent,Router,Dis ...

  7. GUID是什么意思及Guid在sqlserver中的使用

    GUID(全球唯一标识)是微软使用的一个术语,由一个特定的算法,给某一个实体,如Word文档,创建一个唯一的标识,GUID值就是这个唯一的标识码.GUID广泛应用于微软的产品中,用于识别接口.复制品. ...

  8. UILabel的高度自适应

    _content = [UILabel new]; _content.text = @"日落时分,沏上一杯山茶,听一曲意境空远的<禅>,心神随此天籁,沉溺于玄妙的幻境里.仿佛我就 ...

  9. c++primerplus(第六版)编程题——第5章(循环和关系表达式)

    声明:作者为了调试方便,每一章的程序写在一个工程文件中,每一道编程练习题新建一个独立文件,在主函数中调用,我建议同我一样的初学者可以采用这种方式,调试起来会比较方便. (具体方式参见第3章模板) 1. ...

  10. CentOS中vsftp安装、配置、卸载

    1. 安装VSFTP 1 [root@localhost ~]# yum -y install vsftpd 2. 配置vsftpd.conf文件 [root@localhost ~]# vi /et ...