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个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...
随机推荐
- jstat undocumented
jstat -J-Djstat.showUnsupported=true -name btrace.com.sun.btrace.samples.ThreadCounter.count 11674 h ...
- source.list
deb http://www.anheng.com.cn/debian/ squeeze maindeb-src http://www.anheng.com.cn/debian/ squeeze ma ...
- 洛谷 U4704 函数
设gcd(a,b)为a和b的最大公约数,xor(a,b)为a异或b的结果. 题目描述 kkk总是把gcd写成xor.今天数学考试恰好出到了gcd(a,b)=?这样的题目,但是kkk全部理解成了xor( ...
- List转换成DataSet实现代码
public DataSet ConvertToDataSet<T>(IList<T> list) { if (list == null || list.Count <= ...
- Android开发之InstanceState详解(转)---利用其保存Activity状态
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- [转] Linux下移动virtualbox虚拟硬盘丢失eth0
1.遇到什么的问题(What) 在新的virtualbox虚拟机上挂上曾使用过的虚拟硬盘,在启动的时候,发现找不到网卡eth0, 在输入ifconfig –a的时候,也没有任何Ethnet的 ...
- Quartz总结(一):Quartz集成Spring的2个方法
零.引言 关于Spring集成Quartz有2种方法: 1. JobDetailBean. 2. MethodInvokeJobDetailFactoryBean. 以下从自身使用和理解以及掌握的知识 ...
- 《accelerated c++》第九章---设计类
本章简单介绍了类的设计,但是包含了一些好的设计原则. 1一些通用的设计原则 (1)一个函数是否设计成成员函数的原则:如果这个函数改变对象的状态,那么这个函数就应该成为这个对象的成员. (2)对于内置类 ...
- Halcon相关
1.Halcon的自我描述 Program Logic Ø Each program consists of a sequence of HALCON operators Ø The progra ...
- Struts2--中文问题
有中文的情况下, form method都要用post: 如果jsp输入中文返回到后台action输出时会显示乱码, struts.xml已经设置 <constant name="st ...