2782: [HNOI2006]最短母串
2782: [HNOI2006]最短母串
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 3 Solved: 2
[Submit][Status][Web Board]
Description
Input
Output
Sample Input
2
ABCD
BCDABC
Sample Output
ABCDABC
HINT
Source
题解:
首先我的思路十分傻叉,是f[i][j][k]f[i][j][k]表示长度为ii,在自动机上的节点为jj,包含子串的状态为kk可不可能.但这样复杂度直接爆炸.
但是我们可以令f[i][j]f[i][j]表示在自动机上的节点为ii,包含子串的状态为jj时的最短长度.
这样我们就转化成了边权均为1的单源最短路,BFS就行了.
若按照字母字典序从小到大的顺序进行BFS,得出的就是字典序最小的答案了.
(有点卡内存)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int inf=1e9;
struct Node{
int fail,ch[],val;
void clear(){
fail=val=;
memset(ch,,sizeof(ch));
}
}tr[];
int sz;
int bin[],n;
void insert(char *s,int val){
int u=,len=strlen(s);
for(int i=;i<len;i++){
int c=s[i]-'A';
if(!tr[u].ch[c]){
tr[u].ch[c]=++sz;
tr[sz].clear();
}
u=tr[u].ch[c];
}
tr[u].val|=bin[val];
}
void build(){
queue<int>q;q.push();
while(!q.empty()){
int u=q.front();q.pop();
for(int i=;i<;i++){
if(tr[u].ch[i]){
int v=tr[u].ch[i];
if(u)tr[v].fail=tr[tr[u].fail].ch[i];
q.push(v);
}else tr[u].ch[i]=tr[tr[u].fail].ch[i];
}
}
}
int fromu[][],froms[][];
bool vis[][];
void print(int u,int s){
if(!u)return;
print(fromu[u][s],froms[u][s]);
for(int i=;i<;i++){
int v=tr[fromu[u][s]].ch[i],t=froms[u][s];
for(int p=v;p;p=tr[p].fail)
t|=tr[p].val;
if(v==u&&t==s){
putchar('A'+i);
break;
}
}
}
void bfs(){
queue<int>q1,q2;
q1.push();q2.push();
vis[][]=;
while(!q1.empty()){
int u=q1.front(),s=q2.front();q1.pop();q2.pop();
for(int i=;i<;i++){
int v=tr[u].ch[i],t=s;
for(int p=v;p;p=tr[p].fail)
t|=tr[p].val;
if(!vis[v][t]){
vis[v][t]=;
q1.push(v);q2.push(t);
fromu[v][t]=u;
froms[v][t]=s;
if(t==bin[n+]-){
print(v,t);
return;
}
}
}
}
}
char s[];
int main(){
scanf("%d",&n);
tr[sz=].clear();
bin[]=;
for(int i=;i<;i++)bin[i]=bin[i-]<<;
for(int i=;i<=n;i++){
scanf("%s",s);
insert(s,i);
}
build();
bfs();
return ;
}
2782: [HNOI2006]最短母串的更多相关文章
- bzoj 1195: [HNOI2006]最短母串 爆搜
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 894 Solved: 288[Submit][Status] ...
- BZOJ 1195: [HNOI2006]最短母串
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1346 Solved: 450[Submit][Status ...
- P2322 [HNOI2006]最短母串问题
P2322 [HNOI2006]最短母串问题 AC自动机+bfs 题目要求:在AC自动机建的Trie图上找到一条最短链,包含所有带结尾标记的点 因为n<12,所以我们可以用二进制保存状态:某个带 ...
- [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索
[HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...
- 【状态压缩dp】1195: [HNOI2006]最短母串
一个清晰的思路就是状压dp:不过也有AC自动机+BFS的做法 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T ...
- BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图
BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2, ...
- [bzoj1195][HNOI2006]最短母串_动态规划_状压dp
最短母串 bzoj-1195 HNOI-2006 题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串. 注释:$1\le n\le 12$,$1\le ...
- BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩
题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的 ...
- bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机
LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...
随机推荐
- Linux系统编程读书笔记
文件I/O模型 Linux的哲学思想,一切皆文件,这也是Linux文件操作的方便之处.系统调用不会分配缓冲区用以返回信息给调用者.所以必须提前分配大小合适的缓冲区并将缓冲区指针传递给系统调用. 1.o ...
- zepto为什么不支持animate,报animate is not a function
在zepto.min.js文件中搜索animate看有没有,如果没有就是没有加入animate的模块 解决办法,去github中打开src/文件夹,找到fx.js文件,把内容追加到zepto.min. ...
- Mercurial hg web server的配置
在windows下安装tortoisehg-1.0.3-hg-1.5.3-x64.exe的版本控制工具后,克隆建立中心库后,启动web server,其他分库可以连接中心库进行pull但无法push. ...
- 一个完整的ant build.xml
<?xml version="1.0" encoding="UTF-8"?> <project name="genwar" ...
- PAT (Advanced Level) 1073. Scientific Notation (20)
简单模拟题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...
- sql server 日期转换函数 convert()
--内容来自:http://hi.baidu.com/muqingz/item/8fb7b3ca8a485b0cac092f7b Select CONVERT(varchar(100), GETDAT ...
- sql server 行转列 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot 本文转自:张志涛 原文地址: http://www.cnblogs.com/zhangzt/archive/2010/07/29/17878 ...
- ural1523 K-inversions
K-inversions Time limit: 1.0 secondMemory limit: 64 MB Consider a permutation a1, a2, …, an (all ai ...
- protobuf python api
摘要: python中一切都可以看作类.那么如何查看每个类的API.使用ipython python protobuf 的函数在message中定义 此处所有的api说明:https://devel ...
- wireshark tls
想抓一下openfire的包看看,首先要选loopback接口,如果是在本地测试的话. 然后需要搞到rsa私钥,设置好就可以了. keytool -importkeystore -srckeystor ...