HihoCoder 1640 : 命名的烦恼(预处理)
描述
程序员常常需要给变量命名、给函数命名、给项目命名、给团队命名…… 好的名字可以大大提高程序员的主观能动性,所以很多程序员在起名时都会陷入纠结和烦恼。
小Hi希望给新的项目起个拉风的名字。他希望这个名字可以包含N个关键字,并且总长度最短。例如包含关键字abcd、cdab和dabc的最短字符串是cdabcd。
给定N个关键字,请你帮小Hi找到最短的包含所有关键字的字符串。输出这个字符串的长度。
输入
第一行包含一个整数N。(1 <= N <= 15)
以下N行每行包含一个只包含小写字母的字符串。字符串长度不超过100。
输出
输出最短的长度。
样例输入
3
abcd
cdab
dabc
样例输出
6
思路:DP,我们假设已经合并成字符串S,若把str加到末尾,不知道对齐哪一位最优,假设str长度为len,可能对其位数<len,也可能>=len,即覆盖掉前面一个str’。
所以,需要我们预处理包含关系的字符串,删去被包含的字符串,那么就可以DP了。
具体的,dp[2^15][15]表示使用的哪些字符串,最后一个串是哪个,当然,前提是删去了被包含的字符串。
下面是自己写的AC自动机的代码,但是有些错误。。。。
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
const int inf=0x7fffffff;
int dp[][<<];
struct in
{
int dis,pos,opt;
in(int x,int y,int z):dis(x),pos(y),opt(z){}
friend bool operator < (in a,in b){
return a.dis>b.dis;
}
};
priority_queue<in>q;
int Next[maxn],ch[maxn][],End[maxn],N,cnt;
int que[maxn],head,tail; char s[maxn];
struct ACauto
{
void insert(int tag)
{
int Now=;
for(int i=;s[i];i++){
if(!ch[Now][s[i]-'a']) ch[Now][s[i]-'a']=++cnt;
Now=ch[Now][s[i]-'a'];
} End[Now]=<<tag;
}
void build()
{
for(int i=;i<;i++){
if(ch[][i])
que[++head]=ch[][i];
}
while(tail<head){
int u=que[++tail];
for(int i=;i<;i++){
if(ch[u][i]){
que[++head]=ch[u][i];
Next[ch[u][i]]=ch[Next[u]][i];
End[ch[u][i]]|=End[Next[ch[u][i]]];
}
else ch[u][i]=ch[Next[u]][i];
}
}
}
void solve()
{
dp[][]=; q.push(in(,,));
while(!q.empty()){
in tmp=q.top(); q.pop();
int u=tmp.pos, k=tmp.opt;
for(int i=;i<;i++){
int v=ch[u][i],kk=k|End[v];
if(v==) continue;
if(kk==(<<N)-) {
printf("%d\n",dp[u][k]+);
return ;
}
if(dp[v][kk]>dp[u][k]+) {
dp[v][kk]=dp[u][k]+;
q.push(in(dp[v][kk],v,kk));
}
}
}
}
}Trie;
int main()
{
scanf("%d",&N);
for(int i=;i<N;i++){
scanf("%s",s);
Trie.insert(i);
}
Trie.build();
for(int i=;i<=cnt;i++)
for(int j=;j<(<<N);j++)
dp[i][j]=inf;
Trie.solve();
return ;
}
HihoCoder 1640 : 命名的烦恼(预处理)的更多相关文章
- HihoCoder1644 : 完美命名的烦恼([Offer收割]编程练习赛37)(有向图的一笔画问题||欧拉路)
描述 程序员常常需要给变量命名.给函数命名.给项目命名.给团队命名…… 好的名字可以大大提高程序员的主观能动性,所以很多程序员在起名时都会陷入纠结和烦恼. 小Hi希望给新的项目起个完美的名字.首先小H ...
- ios 重用UI部分代码的好方法(再也不用为局部变量的命名而烦恼啦!)
重用控件类代码的一个非常好的解决方案:所有一样的控件其名字均用同样的一个名字.只是在最后赋值的时候,将创建好的控件赋给我们需要用到的那个控件. - (id)initWithFrame:(CGRect) ...
- hihocoder部分题解
hihocoder1609 数组分拆II [dp] 给定数组,问有多少种拆法,使得每一段不出现重复的数字,且要保证分组数最少.(1e5) 题解: O(n) d[i]表示1~i最小划分的段数, f[i] ...
- PHP中使用PDO的预处理功能避免SQL注入
不使用预处理功能 <?php $id = $_GET['id']; $dsn = 'mysql:host=localhost;port=3306;dbname=database'; try { ...
- 【AC自动机&&Trie图】积累
以前KMP和后缀系列(主要是后缀数组,后缀自动机),都刷了一定数量的题,但是对于AC自动机,却有些冷落,罪过. 但是我感觉,在蓝桥杯比赛中AC自动机出现的概率比后缀系列大,简单的会考匹配,稍难一点会考 ...
- 10 Symbol
Symbol 书中讲了2部分. Symbol() Symbol 属性值. 完全两种画风的东西. 1. Symbol 首先他是一种全新的值. 不属于以前的任何一种 ES6引入了一种新的原始数据类型Sym ...
- Google C++ 风格指南 命名约定 转
命名约定 最重要的一致性规则是命名管理. 命名风格快速获知名字代表是什么东东: 类型? 变量? 函数? 常量? 宏 ... ? 甚至不需要去查找类型声明. 我们大脑中的模式匹配引擎可以非常可靠的处理这 ...
- Countries
Countries 题目链接:http://hihocoder.com/problemset/problem/1391 预处理+双指针 首先将A->B,B->A的导弹全部转化为B-> ...
- Google C++编程风格指南 - 中文版
Google C++编程风格指南 - 中文版 from http://code.google.com/p/google-styleguide/ 版本: 3.133原作者: Benjy Weinberg ...
随机推荐
- C#使用CurrentUICulture切换语言
1. 创建2个窗口 2. 窗口1属性Localizable设置为True,Language选择英语(美国) 然后把窗口1中控件的Text由中文编辑成英文,Form2一样设置. 此时,Form1 ...
- sql的一些知识_where
简单相同查询,查询age=22的三列信息,并按照降序排列 ORDER BY weight DESC 此外,where还支持一下判断操作符 值得注意的是,如果比较的值为数值,则不需要加引号,如果是字符, ...
- css3 - 动态伪类
动态伪类分为以下几种: 1. hover(经过) 2. active(点击后) 3. focus(聚焦) - input专用 4. visited(访问后) 使用:
- MySQL获得指定数据表中auto_increment自增id值的方法及实例
http://kb.cnblogs.com/a/2357592/很多情况下,我们要提前用到当前某个表的auto_increment自增列id,可以通过执行sql语句来查询到这个id值. show ta ...
- Linux Kernel Maintainers
http://en.wikipedia.org/wiki/Ingo_Molnár http://zh.wikipedia.org/wiki/英格·蒙內 Ingo Molnár Ingo Molnár, ...
- ubuntu安装交叉编译工具链
一.sudo su 切换到root用户权限 二.将arm-linux-gcc-4.3.2.tgz从windows拷贝到Linux /home/ttt/arm-linux-gcc-4.3.2.tgz ...
- Ubuntu引导出问题grub rescu模式下:“error : unknown filesystem”或者 找不到normal.mod 的解决办法
感谢http://www.linuxidc.com/Linux/2012-06/61983.htm,因为参考了其中的内容. 下面是修改和完善. 问题原因: (win7,ubuntu双系统下) 强制关机 ...
- Tomcat appears to still be running with PID 19564. Start aborted
产生原因:tomcat 异常关闭, 或强行终止导致(如断电等....) 如你所见 . tomcat 在linux 关, 关不了. 开开不了. 疯狂百度一个小时以后,大致产生问题的原因是,LINUX ...
- MongoDB 征途
到目前为止,对数据库这块仍然捉襟见肘,仅限于懂一些MySQL,就更谈不上什么优化了. 细想来,还是没有项目驱动造成的...既然跟关系型数据库缘分未到,干脆直接go to NoSQL - MongoDB ...
- android:PopupWindow的使用场景和注意事项
1.PopupWindow的特点 借用Google官方的说法: "A popup window that can be used to display an arbitrary view. ...