AC+DP练习
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练习的更多相关文章
- 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][ ...
- BZOJ_1030_[JSOI2007]_文本生成器_(AC自动机+DP)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1030 给出一些单词,问长度为\(m\)的文章有多少文章中出现过任意一个或多个单词. 分析 文章 ...
- BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...
- HUNAN 11569 Just Another Knapsack Problem(AC自动机+dp)
http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11569&courseid=0 给出目标串,每个子串和 ...
- 哈理工新生赛 马拉车+贪心 最大密度子图 AC自动机+DP
J.Symmys Time Limit: 1000 MS Memory Limit: 262144 K Total Submit: 50 (13 users) Total Accepted: 2 (2 ...
- [JSOI2009]密码 [AC自动机]
题面 bzoj luogu 首先看到这题就知道随便暴枚 只要是多项式算法都能过 先常规建AC自动机 注意被别的单词包含的单词没有存在的价值 剩余单词状压 大力dp f[长度][节点编号][状态] \( ...
- 沉迷AC自动机无法自拔之:[UVALive 4126] Password Suspects
图片加载可能有点慢,请跳过题面先看题解,谢谢 一看到这么多模式串就非常兴奋,又是\(AC\)自动机 题目就是要求:经过 \(n\) 个节点,把所有单词都遍历一遍的方案数,和那道题差不多嘛 所以这样设: ...
- 沉迷AC自动机无法自拔之:穿越广场 square
如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 穿越广场 [问题描述] L 国的仪仗队要穿越首都广场了.首都广场可以看做是一块 N*M 的矩形网格,仪仗队 ...
- 51nod1254 最大子段和 V2 DP
---题面--- 题解: 表示今天做题一点都不顺.... 这题也是看了题解思路然后自己想转移的. 看的题解其实不是这道题,但是是这道题的加强版,因为那道题允许交换k对数. 因为我们选出的是连续的一段, ...
随机推荐
- 亲测linux6.4 安装
1.bios下点击 u盘 启动进入(两个Flash1.0,都试试) 2.最关键的部分是,不如windows启动 没有linux界面. others(只是把这个修改一下名字为windows7) cent ...
- 本地如何搭建IPv6环境测试你的APP
IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...
- 剑指offer: 38 数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5} 和数字3,输出4. 思路如下 1. 预估时间复杂度,最复杂情况是,顺序扫描,统计K出现的次数,时间复杂 ...
- Ubuntu上安装jdk,Jboss
Ubuntu上安装jdk 1.使用wget命令或sft方式从oracle官方下载tar.gz格式的jdk1.7,由于ubuntu不支持rpm安装,需要转换,所以不选择rpm格式的jdk 2.使用tar ...
- lucene 抛出的异常(分享)
1) too many boolean clauses异常 例如: String keyword=".......";//(keyword的长度太长) Query indexQue ...
- transition的四个属性
transition-property 规定设置过渡效果的 CSS 属性的名称. transition-duration 规定完成过渡效果需要多少秒或毫秒. transition-timing-fun ...
- Node.js + Express + Mongodb 开发搭建个人网站(一)
一.Node + Express环境搭建 0.去Node官网下载安装node,如果安装了 npm 和 node的话 那么就 安装 全局的 express,-g全局安装 npm install expr ...
- 查看sql语句执行时间/测试sql语句性能
写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务器的响应时间有多快,这个时候就需要用到SQL的STATISTICS状态值来查看了. 通过设置STATISTICS我们可以查看执行SQL时的 ...
- 行列的几种命名方式.line-.colume======.row-.col=========.tr-.td
第一种从line-height的语义来来讲,line表示hang再贴切不过了,colume纵列或者柱子也很形象,缺点太长了 第二种组合模拟rowspan,colspan而来,想必这个col也是colu ...
- jQuery常用技巧大放送
1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用do ...