问题描述

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的更多相关文章

  1. 【题解】POJ1934 Trip (DP+记录方案)

    [题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...

  2. poj1934 Trip【线性DP】【输出方案】

    Trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3850   Accepted: 1030 Description ...

  3. SPOJ33&POJ1934 Trip LCS

    题目传送门:https://www.luogu.org/problemnew/show/SP33 题目大意:给出两个字符串,求其LCS(最长公共子序列)的长度与具体方案(相同的串算作同一方案).数据组 ...

  4. $Poj1934\ Trip$ 线性$DP+$搜索

    Luogu Description 爱丽丝和鲍伯想去度假,他们每个人都制定了一个参观城市的清单,该地区正好有26个城市,因此它们被编码为小写字母“a”到“z”.清单上可能重复出现某个城市.因为他们想一 ...

  5. POJ1934 Trip 题解

    LCS 模板,但要输出具体方案,这就很毒瘤了. 神奇的预处理:fa[i][j]表示在 \(a\) 串的前 \(i\) 个字符中,字母表第 \(j\) 个字母最晚出现的位置,fb[i][j]同理. 这样 ...

  6. 常规DP专题练习

    POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...

  7. 题解 【POJ1934】 Trip

    题目意思: 有两个字符串(长度\(<=80\)),按字典序输出它们的最长公共子串的所有情况. 解析 最长公共子序列的长度应该都没问题了吧...有问题请自行百度 但关键是要求出每种情况,还要按字典 ...

  8. 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 ...

  9. dp or 贪心 --- hdu : Road Trip

    Road Trip Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 29 ...

随机推荐

  1. fedora23安装firefox中的flash插件-最终解决问题是: 要给libflashplayer.so以777权限, 开始给的755权限没有实现!

    下载的flash插件是一个rpm包. ===================================== rpm查看文件属于哪个包? 要看这个rpm包安装过还是没有安装过? (如果不用-p就是 ...

  2. fedora如何使用themes主题?

    DBus: 是一个 local 的IPC 进程间通信机制 如果是(一对一) 多对多的通信, 则DBUS 后台充当了一个路由器的角色. ibus: 是包含: python gtk dbus的 scim- ...

  3. PHP 常用函数-url函数

    urlencode 和 rawurlencode urlencode 和 rawurlencode 两个函数都用来编码 URL 字符串.除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后 ...

  4. 69.x的平方根

    class Solution: def mySqrt(self, x: int) -> int: if x < 2: return x left, right = 1, x//2 whil ...

  5. 应用安全-安全设备-Waf系列-软Waf-D盾

    安装 下载http://www.d99net.net/down/d_safe_2.1.5.2.zip 使用说明 http://www.d99net.net/News.asp?id=106 免杀 arr ...

  6. Vue路由注意事项

    一.vue中路由的使用 1.定义组件 <template> <div class="hello"> <h1 @click="info&quo ...

  7. C#后台获取日期:当天、前七天、后七天

    DateTime.Now.ToString(); //当前时间DateTime.Now.AddDays(7).ToString(); //当前时间加上7天DateTime.Now.AddDays(-7 ...

  8. 浅谈WebService开发二(同步与异步调用)转

    上文 <http://www.dotnetgeek.cn/xuexiwebservice1.html>已经跟大家说了,如果创建一个webservice和简单的调用,本文将注重webserv ...

  9. SpringBoot内嵌数据库的使用(H2)

    配置数据源(DataSource) Java的javax.sql.DataSource接口提供了一个标准的使用数据库连接的方法. 传统做法是, 一个DataSource使用一个URL以及相应的证书去构 ...

  10. jsp自定义标签处理转义字符

    sun公司提供的jstl虽然比较强大,但是开发中很难满足我们所有的需求,并且开发也禁止在jsp中写很多java代码,因此很多场景需要自己定义标签进行项目开发 sun提供的标签库引用方式:<%@t ...