[POJ1934] Trip
问题描述
Alice and Bob want to go on holiday. Each of them has planned a route, which is a list of cities to be visited in a given order. A route may contain a city more than once. As they want to travel together, they have to agree on a common route. None wants to change the order of the cities on his or her route or add other cities. Therefore they have no choice but to remove some cities from the route. Of course the common route should be as long as possible. There are exactly 26 cities in the region. Therefore they are encoded on the lists as lower case letters from 'a' to 'z'.
输入格式
- The input consists of two lines; the first line is Alice's list, the second line is Bob's list.
- Each list consists of 1 to 80 lower case letters with no spaces in between.
输出格式
The output should contain all routes that meet the conditions described above, but no route should be listed more than once. Each route should be printed on a separate line. There is at least one such non-empty route, but never more than 1000 different ones. Output them in ascending order.
样例输入
abcabcaa
acbacba
样例输出
ababa
abaca
abcba
acaba
acaca
acbaa
acbca
题目大意
求两个字符串的最长公共子串,并将所有方案输出。方案之间不能重复。
题解
首先显然要用动态规划的方法把最长公共子串的长度求出来。那么怎么输出方案呢?显然动态规划的方法行不通。因此我们可以尝试构造的方法来手动构造子串。设\(f1[i][j]\)表示在第一个串中字符\(i\)在第\(j\)位前最晚出现的位置,同理也有\(f2[i][j]\)。那么利用深搜从后往前构造,dfs的参数中分别为当前在第一个串中的位置\(x\),在第二个串中的位置\(y\),构造出来的子串\(s\)和还需要构造的长度\(l\)。在每一层中从\(a\)~\(z\)枚举,找出该字符在两个串中的最近的位置(记为p1和p2)。如果该字符在两个字符串中均存在且两个字符串在p1和p2处的最长公共子序列长度不小于\(l\),那么就继续递归。最后把所有构造出的子串按字典序排序即可。
代码
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>
#define N 82
using namespace std;
string a,b;
int i,j,la,lb,f[N][N],f1[N][N],f2[N][N];
vector<string> v;
void dfs(int x,int y,string s,int l)
{
if(x<0||y<0) return;
if(l<=0){
v.push_back(s);
return;
}
for(int i=0;i<26;i++){
int p1=f1[i][x],p2=f2[i][y];
if(f[p1][p2]>=l){
char c='a'+i;
dfs(p1-1,p2-1,c+s,l-1);
}
}
}
int main()
{
cin>>a>>b;
la=a.length();
lb=b.length();
for(i=la;i>=1;i--) a[i]=a[i-1];
for(i=lb;i>=1;i--) b[i]=b[i-1];
for(i=1;i<=la;i++){
for(j=1;j<=lb;j++){
f[i][j]=max(f[i-1][j],f[i][j-1]);
if(a[i]==b[j]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
}
for(i=0;i<26;i++){
for(j=1;j<=la;j++){
if(a[j]=='a'+i) f1[i][j]=j;
else f1[i][j]=f1[i][j-1];
}
for(j=1;j<=lb;j++){
if(b[j]=='a'+i) f2[i][j]=j;
else f2[i][j]=f2[i][j-1];
}
}
int len=f[la][lb];
dfs(la,lb,"",len);
sort(v.begin(),v.end());
for(i=0;i<v.size();i++) cout<<v[i]<<endl;
return 0;
}
[POJ1934] Trip的更多相关文章
- 【题解】POJ1934 Trip (DP+记录方案)
[题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...
- poj1934 Trip【线性DP】【输出方案】
Trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3850 Accepted: 1030 Description ...
- SPOJ33&POJ1934 Trip LCS
题目传送门:https://www.luogu.org/problemnew/show/SP33 题目大意:给出两个字符串,求其LCS(最长公共子序列)的长度与具体方案(相同的串算作同一方案).数据组 ...
- $Poj1934\ Trip$ 线性$DP+$搜索
Luogu Description 爱丽丝和鲍伯想去度假,他们每个人都制定了一个参观城市的清单,该地区正好有26个城市,因此它们被编码为小写字母“a”到“z”.清单上可能重复出现某个城市.因为他们想一 ...
- POJ1934 Trip 题解
LCS 模板,但要输出具体方案,这就很毒瘤了. 神奇的预处理:fa[i][j]表示在 \(a\) 串的前 \(i\) 个字符中,字母表第 \(j\) 个字母最晚出现的位置,fb[i][j]同理. 这样 ...
- 常规DP专题练习
POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...
- 题解 【POJ1934】 Trip
题目意思: 有两个字符串(长度\(<=80\)),按字典序输出它们的最长公共子串的所有情况. 解析 最长公共子序列的长度应该都没问题了吧...有问题请自行百度 但关键是要求出每种情况,还要按字典 ...
- Lesson 4 An existing trip
Text I have just received a letter from my brother,Tim. He is in Australia. He has been there for si ...
- dp or 贪心 --- hdu : Road Trip
Road Trip Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 29 ...
随机推荐
- redis和memcached的对比与选型
相似处: 1:Memcached与Redis都属于内存内.键值数据存储方案.均属于NoSQL家族,而且都基于同样的键值数据模型.双方都选择将全部数据保存在内存当中,这自然也就让它们成为非常理想 ...
- Java 基础-IO、stream 流、文件操作
输入输出流的分类 在 java.io 包中,包含了输入输出操作所需的类. I/O 流可以安装不同的标准分类: 按照流的方向分类: 输入流:将信息从代码外部输入代码 输出流:将代码得到的数据输出到文件. ...
- Android安全测试(二)反编译检测
1.测试环境 SDK: Java JDK, Android SDK. 工具: 7zip, dex2jar, jd-gui 2.操作步骤 第一步:把apk改后缀名为zip 第二步:将zip文件解压,得到 ...
- failed to create process ,pip报错问题
- 关于服务器无法在已发送http表头之后设置状态问题
Response.ClearHeaders()方法 ClearHeaders方法只删除头信息,而不删除Response显示输出信息. this.Response.BufferOutput = true ...
- vue项目 多文件上传并显示在页面上
<template> <label for="file" class=" btn btn-default" style="borde ...
- css的继承之width属性(容易忽略)
众所周知,css的三大特性分别是 继承性,层叠性,和优先级. 那么这里就详细说一下css中width的继承性及其特殊情况. 继承性概念详解:css的继承性指的被包在内部的标签拥有外部标签的样式性,子元 ...
- CentOS6 破解登录密码
1.重启服务器,在倒数读秒的时候按任意键,就会出现如下界面 2.按e进入grub模式,选中kernel,然后按e进入内核编辑模式 3.进入内核编辑模式后,按空格+1回车(或按空格+single回车)退 ...
- python 重点理论知识点
Python多线程 GIL blablabla concurrent blablabla 简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的 ...
- java 线程池(线程的复用)
一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动 ...