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 ...
随机推荐
- Caused by: java.io.FileNotFoundException: rmi_keystore.jks (没有那个文件或目录)
解决方法:修改jmeter.properites: server.rmi.ssl.disable=true,关闭ssl功能 参考: https://blog.csdn.net/nielinqi520/ ...
- 将可执行程序的内存空间扩展到3GB(windows)
为了告知操作系统这个应用程序可以支持/3GB方式,我们需要往exe 文件头中添加一个 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志.添加的方式很简单: 在你的系统的 Progra ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 import java.math.BigInteger; import java.util.ArrayLi ...
- Python学习笔记8:标准库之正則表達式
Python拥有强大的标准库.从如今起,開始学习标准库中提供的一些经常使用功能. 首先看正則表達式(regular expression),它的主要功能是从字符串(string)中通过特定的模式(pa ...
- 百科知识 scm文件如何打开
用scplayer打开,目前有效的下载链接将是: http://download.csdn.net/download/kevingao/2686778
- 【Python】输出程序运行的百分比
对于一些大型的Python程序.我们须要在命令行输出其百分比,显得更加友好,以免被人误会程序陷入死循环.假死的窗口. 关键是利用到不换行的输出符\r,\r的输出.将直接覆盖掉此行的内容. 比方例如以下 ...
- PHP_EOL是什么意思?
PHP_EOL 代表php的换行符, 这个变量会根据平台而变, 在windows下会是/r/n, 在linux下是/n, 在mac下是/r 文章来源:刘俊涛的博客 地址:h ...
- Odoo10尝鲜:MRP 10 新概念
OEE [ overall equipment Effectiveness 整体设备效率 ] 整體設備效率是整合稼働率 (Availability).產能效率 (Performance).良率 (Qu ...
- CUDA编程->CUDA入门了解(一)
安装好CUDA6.5+VS2012,操作系统为Win8.1版本号,首先下个GPU-Z检測了一下: 看出本显卡属于中低端配置.关键看两个: Shaders=384.也称作SM.或者说core/流处理器数 ...
- 笔记本Charge与Vcore方案
一.笔记本Vcore方案 EC管理智能电池的方案名词简介 我所知道的EC====>Battery 立錡VCORE解決方案簡介 ATX Power Supply 涡轮加速升压(turbo-boo ...