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 ...
随机推荐
- 几种支持动作模型格式的比较(MD2,MD5,sea3d) 【转】
最近使用了几种不同的模型格式做人物动作的表现,记录一下优缺点 1) MD2 数据内容: 记录了所有动作顶点数据 数据格式: 二进制 动作文件: 动作文件合并在一个模型文件 文件大小: 动作多时很大 ...
- Ubuntu中一次更改用户名带来的连锁反应
我是一个ubuntu新手,接触ubuntu半年不到,装系统的时候输入了一个用户名,但是最近突然想更名了,这是悲剧的开始! google:ubuntu change username等相关的关键字,最终 ...
- mysql大数据量下修改表结构的方法
http://www.blogjava.net/anchor110/articles/361152.html
- VueJS数据绑定文本显示:{{message}}
HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- python正则中的贪婪与非贪婪
当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式.当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号.匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 ...
- Phalcon框架如何实现读写分离
Phalcon框架如何实现读写分离 假设你已经在DI容器里注册了俩 db services,如下: <?php // 主库 $di->setShared('dbWrite', functi ...
- android中的MD5、Base64、DES/3DES/ADES加解密
MD5摘要算法: <span style="font-size:18px;">主要代码: String s = edit.getText().toString(); i ...
- 发送验证码60s倒计时实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python-tornado操作
Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效 ...
- css-装饰
css -在标签上设置style样式 background-color:#2356a1 height:48px -编写样式方法 1.标签的style属性 2.鞋子head里面,style标签中编写 - ...