/*

难的不是ac自动机,是状态压缩dp

之前做了一两题类似题目,感觉理解的还不够透彻

*/

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int mxn=;
int L1[mxn*(<<)],L2[mxn*(<<)];
queue<int>q1,q2;
bool vis[mxn][(<<)];
int n;
int ans[mxn],num=;
struct ACa{
int t[mxn][];
int fail[mxn];
int end[mxn];
int S,cnt;
int q[],hd,tl;
void init(){S=cnt=;memset(end,,sizeof end);return;}
void insert(char *s,int id){
int len=strlen(s),now=S;
for(int i=;i<len;i++){
if(!t[now][s[i]-'A'])t[now][s[i]-'A']=++cnt;
now=t[now][s[i]-'A'];
}
end[now]|=(<<id);
}
void Build(){
hd=;tl=;
for(int i=;i<;i++)
if(t[S][i]){q[++tl]=t[S][i];fail[t[S][i]]=S;}
else t[S][i]=S;
while(hd<=tl){
int u=q[hd++];
int v,r;
for(int i=;i<;i++){
if(t[u][i]){
fail[t[u][i]]=t[fail[u]][i];
end[t[u][i]]|=end[t[fail[u]][i]];
q[++tl]=t[u][i];
}
else t[u][i]=t[fail[u]][i];
}
}
return;
}
void solve(){
hd=;tl=;int ed=(<<n)-;
q1.push(S),q2.push();
while(hd<=tl){
int u=q1.front();q1.pop();
int e=q2.front();q2.pop();
// printf(" e:%d\n",e);
if(e==ed){//结束状态
for(;hd>;hd=L2[hd]){ans[++num]=L1[hd];}
for(int i=num;i;i--)printf("%c",ans[i]+'A');
return;
}
for(int i=;i<;i++){
if(!vis[t[u][i]][e|end[t[u][i]]]){
L1[++tl]=i;
L2[tl]=hd;
q1.push(t[u][i]);
q2.push(e|end[t[u][i]]);
vis[t[u][i]][e|end[t[u][i]]]=;
}
}
hd++;
}
}
}ac;
char s[];
int main(){
int i,j;
scanf("%d",&n);
ac.init();
for(i=;i<n;i++)scanf("%s",s),ac.insert(s,i);
// for(i=1;i<=ac.cnt;i++)if(ac.end[i])printf("%d %d\n",i,ac.end[i]);
ac.Build();
ac.solve();
return ;
}

bzoj1195 神奇的ac自动机+状态压缩dp的更多相关文章

  1. HDU 4511 (AC自动机+状态压缩DP)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...

  2. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  3. hdu 4057(ac自动机+状态压缩dp)

    题意:容易理解... 分析:题目中给的模式串的个数最多为10个,于是想到用状态压缩dp来做,它的状态范围为1-2^9,所以最大为2^10-1,那我们可以用:dp[i][j][k]表示长度为i,在tri ...

  4. HDU 4057 Rescue the Rabbit ( AC自动机 + 状态压缩DP )

    模板来自notonlysuccess. 模式串只有10个,并且重复出现的分值不累加,因此很容易想到状态压缩. 将模式串加入AC自动机,最多有10*100个状态. dp[i][j][k]:串长为i,在T ...

  5. 计蒜客-蒜场抽奖(AC自动机+状态压缩DP)

    题解:题意不再说了,题目很清楚的. 思路:因为N<=10,所以考虑状态压缩 AC自动机中 val[1<<i]: 表示第i个字符串.AC自动机中fail指针是指当前后缀在其他串里面所能 ...

  6. HDU 4758 Walk Through Squares( AC自动机 + 状态压缩DP )

    题意:给你两个串A,B, 问一个串长为M+N且包含A和B且恰好包含M个R的字符串有多少种组合方式,所有字符串中均只含有字符L和R. dp[i][j][k][S]表示串长为i,有j个R,在自动机中的状态 ...

  7. hdu 2825(ac自动机+状态压缩dp)

    题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...

  8. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...

  9. Wireless Password - HDU 2825(ac自动机+状态压缩)

    题目大意:有个人想破解他邻居的密码,他邻居告诉了一些关于这个密码的信息,并且给他一个单词集合,他用这些信息判断一下最少有多少种密码. 1->, 所有的密码都是有小写字母组成. 2->,密码 ...

随机推荐

  1. P2709 小B的询问(莫队入门)

    题目链接:https://www.luogu.org/problemnew/show/P2709 题目大意:中文题目 具体思路:莫队入门题,按照离线的方式打的,对每一个区间进行分块和编号,如果在同一个 ...

  2. mysql 案例 ~超时时间设置

    一 简介:今天咱们来谈谈mysql的连接时间与会话关系二 分类  mysql会话分类  1 程序连接session(最主要的)  2 binlog连接session(复制+canal消费)  3 ro ...

  3. python问题:TypeError: a bytes-like object is required, not 'str'

    源程序: import socket target_host = "www.baidu.com" # 127.0.0.1 target_port = 80 # 建立一个socket ...

  4. HDOJ 3308 LCIS (线段树)

    题目: Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. ...

  5. 利用crash 分析软死锁问题【转】

    转自:https://blog.csdn.net/divlee130/article/details/47806551 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  6. Cisco端口限速配置

    作者:邓聪聪 Cisco端口限速的配置 配置案例如下: 定义策略组: access-list ID permit ip any any 模版关联策略组: class-map match-all nam ...

  7. RDLC系列之一 简介和入门

    一.简介 RDLC报表,通过Report Viewer Control来实现,制作微软RDLC报表由以下三部分构成:1.制作自己的DateSet集合(就是报表的数据集):2.制作自己的报表文件.rdl ...

  8. macbook 安装win7

    长按option进入启动选择页面,选择winpe后进入安装,与普通电脑没有区别.安装后需要安装苹果专用驱动程序Boot Camp,才可以正常使用触控板等驱动

  9. 031_keepalive+nginx保证nginx高可用

    一. yum -y install keepalived keepalived配置: keepalived.conf: vrrp_instance proxy { state BACKUP inter ...

  10. OracleAES加密

    OracleAES加密 (2012-04-29 21:52:15)转载▼标签: oracle aes 加密 it 分类: 开发-- 加密函数CREATE OR REPLACE FUNCTION FUN ...