2782: [HNOI2006]最短母串

2782: [HNOI2006]最短母串

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 3  Solved: 2
[Submit][Status][Web Board]

Description

给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串。

Input

第一行是一个正整数n(n<=12),表示给定的字符串的个数。以下的n行,每行有一个全由大写字母组成的字符串。每个字符串的长度不超过50.

Output

只有一行,为找到的最短的字符串T。在保证最短的前提下,如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个。

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[26],val;void clear(){fail=val=0;memset(ch,0,sizeof(ch));}
}tr[605];
int sz;
int bin[20],n;
void insert(char *s,int val){int u=0,len=strlen(s);for(int i=0;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(0);while(!q.empty()){int u=q.front();q.pop();for(int i=0;i<26;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[605][4100],froms[605][4100];
bool vis[605][4100];
void print(int u,int s){if(!u)return;print(fromu[u][s],froms[u][s]);for(int i=0;i<26;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(0);q2.push(0);vis[0][0]=1;while(!q1.empty()){int u=q1.front(),s=q2.front();q1.pop();q2.pop();for(int i=0;i<26;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]=1;q1.push(v);q2.push(t);fromu[v][t]=u;froms[v][t]=s;if(t==bin[n+1]-1){print(v,t);return;}}}}
}
char s[55];
int main(){scanf("%d",&n);tr[sz=0].clear();bin[1]=1;for(int i=2;i<20;i++)bin[i]=bin[i-1]<<1; for(int i=1;i<=n;i++){scanf("%s",s);insert(s,i);}build();bfs();return 0;
}
View Code

 

转载于:https://www.cnblogs.com/HQHQ/p/5369078.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c java 内部类_java程序中能否在内部类当中再定义一个内部类?

展开全部我被你的想62616964757a686964616fe78988e69d8331333363386664法震撼了,哈哈.亏你想的出来...这么弄代码不好理解,Java看起来醒目,也是Java中的一个规范!可以吗?必须可以..看代码演示...声明下,我也第一次,多次嵌套,看你想法后去试验下是可行的我用的两种办法!不多说看…

pythongui做计算器_python 实现简单的计算器(gui界面)

运行效果&#xff1a;完整代码from tkinter import *def click(num):global opopopstr(num)iptext.set(op)def evaluate():global opoutputstr(eval(op))iptext.set(output)def clearDisplay():global opop""iptext.set(op)calcTk()calc.title("TechVidvan Calc…

ios学习笔记——RunTime

Objective—C是面向运行时的语言&#xff0c;就是说它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。这就给你很大的灵活性&#xff0c;你可以按需要把消息重定向给合适的对象&#xff0c;你甚至可以交换方法的实现。最重要的还是消息机制。 C语言使用“静态绑定”&#…

exhaustion java_Java Player.setExhaustion方法代碼示例

import org.bukkit.entity.Player; //導入方法依賴的package包/類/*** Set SamaGamesAPI*/Overridepublic void startGame(){this.getInGamePlayers().forEach(((uuid1, survivalPlayer) -> survivalPlayer.getPlayerIfOnline().closeInventory()));super.startGame();Objec…

python内存池机制_python的内存管理机制

一、python是一个什么样类型的语言1、python是一种动态解释性强类型定义的高级、通用性编程语言。解释型&#xff1a;执行的时候&#xff0c;才一条一条的解释成机器语言给计算机来执行。如&#xff1a;python、js、ruby、PHP等编译型&#xff1a;把源程序的每一条语句都编译成…

MATLAB GUI不同控件函数间变量传递方法

在GUI中一个控件函数结束后&#xff0c;会将在这个函数中使用的变量全部删除&#xff0c;如果想在另一个控件中使用&#xff0c;则必须想办法将这个变量保存传递&#xff0c;方法有以下几种&#xff1a;1、使用globe定义全局变量&#xff0c;这种方法不是很好&#xff0c;一方面…

java变量数据类型_java变量与数据类型

第二章 变量与数据类型变量变量的概述变量是指内存中的一个存储区域&#xff0c;该区域要有自己的名称(变量名)、类型(数据类型)&#xff0c;该区域的数据可以在同一数据类型的范围内不断变化值。每个变量都有自己的作用范围&#xff0c;叫作用域变量的注意事项1.Java中的变量必…

python实现推荐系统代码_推荐系统之矩阵分解及其Python代码实现

有如下R(5,4)的打分矩阵&#xff1a;(“-”表示用户没有打分)其中打分矩阵R(n,m)是n行和m列&#xff0c;n表示user个数&#xff0c;m行表示item个数那么&#xff0c;如何根据目前的矩阵R(5,4)如何对未打分的商品进行评分的预测(如何得到分值为0的用户的打分值)&#xff1f;——…

数据库分区分表以及读写分离

谈谈怎么实现Oracle数据库分区表 Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法&#xff0c;做手头的项目以前&#xff0c;只聆听过分区的大名&#xff0c;感觉特神秘&#xff0c;看见某某高手在讨论会上夸夸其谈时&#xff0c;真是骂自己学艺不精&#x…

java第二章_JAVA第二章知识点

JAVA第二章知识点本章知识梳理2.1 关键字2.2 标识符2.3 变 量2.4运算符2.5 程序流程控制2.6 方法2.1 关键字关键字(keyword)的定义和特点定义&#xff1a;被java语言赋予了特殊含义&#xff0c;用做专门用途的字符串(单词)特点&#xff1a;关键字中所有字母都为小写保留字(rese…

JSP Workshop

http://www.cnblogs.com/ITtangtang/p/4126395.html 发现http://www.tutorialspoint.com/里的资料很全也很不错啊&#xff01; 资料&#xff1a;http://www.tutorialspoint.com/jsp/jsp_tutorial.pdf 另外&#xff0c;http://www.runoob.com/jsp/jsp-tutorial.html 中关于JSP…

崇天老师python123测验6_嵩天老师python123测验1: Python基本语法元素 (第1周)

选择题**Guido van Rossum正式对外发布Python版本的年份是&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪…

从链接中获取文件名及扩展名

exeStr [filePath lastPathCompoment];   从链接中读取完整的带后缀文件名称 exeStr [filePath stringByDeleteExtension]; 从链接中读取不带后缀名的文件名称 fileType [filePath pathExtension];       获得链接中文件扩展名&#xff0c;不带"." …

mysql的学习要点_MySQL中的联合索引的学习要点总结

MySQL中的联合索引的学习要点总结联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段&#xff0c;一个查询可以只使用索引中的一部份&#xff0c;但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找&#xff0c;但不…

h5页面不可 移动_H5营销|为什么H5适合于微信营销

随着互联网技术的不断发展&#xff0c;更新在移动互联网时代&#xff0c;网络营销也开始越来越新颖化&#xff0c;而微信H5就是其中的佼佼者。它的出现满足了用户视觉上的审美要求&#xff0c;并且可以使营销方式变得更加的美观整洁&#xff0c;那么这里就有一个问题。为什么微…

input框

input: 输入时与输入框有点距离 padding-left: 5px; 点击时没有浅蓝色的框&#xff1a; outline: none; 设置输入框背景颜色&#xff1a;background: seagreen; 提示语&#xff1a; placeholder"请输入搜索内容" 放在HTML 输入框有图像&#xff1a; background-image…

python3 image_python3 ImageTk 安装方法

标签&#xff1a;使用命令&#xff1a;$ sudo yum search PIL | grep python3可显示得知&#xff1a;python3-dogpile-cache.noarch : A caching front-end based on the Dogpile lock.python3-dogpile-core.noarch : A ‘dogpile‘ lock, typically used as a component ofpyt…

亚太地区数学建模优秀论文_数学建模美赛强势来袭!

01美赛&#xff0c;即美国大学生数学建模竞赛(MCM/ICM)又要来啦&#xff01;赛题内容涉及经济、管理、环境、资源、生态、医学、安全、未来科技等众多领域。竞赛要求三人(本科生)为一组&#xff0c;在四天时间内&#xff0c;就指定的问题完成从建立模型、求解、验证到论文撰写的…

《软件调试》读书笔记:第13章 硬错误和蓝屏

会话管理器进程SMSS.exe是系统启动后的第一个用户态进程&#xff0c;负责启动和监护windows子系统进程&#xff1a;CSRSS.exe和登陆管理进程&#xff1a;WinLogonSMSS.exe从注册表中查询子系统exe文件的位置&#xff0c;并且启动它 CSRSS是windows子系统进程&#xff0c;自NT4以…

java selenium教程_Selenium3 Java自动化测试完整教程

本课程为一个完整的selenium自动化测试实战课程&#xff0c;采用当前**的版本3。学完后可以独立构建起企业级/项目级的自动化测试&#xff0c;从搭建环境、编写脚本、使用框架组织运行脚本与输出报告、及与持续集成工具Jenkins结合达到构建后即测试或指定晚上运行等方式&#x…