题目意思:

有两个字符串(长度\(<=80\)),按字典序输出它们的最长公共子串的所有情况.

解析

最长公共子序列的长度应该都没问题了吧...有问题请自行百度

但关键是要求出每种情况,还要按字典序...

考虑到长度\(<=80\),我们可以用搜索+剪枝,

设两个串为\(a\),\(b\),长度为\(la\),\(lb\),

\(f[i][j]\)表示\(a\)串中的\(1\)~\(i\)与\(b\)串中的$ 1\(~\)j$的最长公共子序列的长度.

先求出最长公共子序列的长度\(len\)=\(f[la][lb]\),

那么.我们就是要求出一个长度为\(len\)的\(a\),\(b\),的子串,

我们再设\(f1[i][j]\)表示在\(a\)串的\(1\)~\(j\)中,字母\(i\)出现的最后一个位置,

\(f2[i][j]\)就表示\(b\)串,其中\(i\)取\(1\)~\(26\),

那么在搜索时,记录\(4\)个信息:\(a\)串还能取的长度\(l1\),\(b\)串还能取的长度\(l2\),当前求出的子串\(s\)和还需要求的子串的长度\(l\).

那么,在一开始时,状态就应该是(\(la,lb,"",len\)),其中\(s\)是一个空串.

那么,在搜索时枚举每个字母\(ci\),设\(p1\)表示\(f1[ci][l1]\),\(p2\)表示\(f2[ci][l2]\),

那么,若\(f[p1][p2]>=l\),即最终能形成长度为\(len\)的子串,就将\(ci\)加入\(s\),

并且注意,由于我们是倒着搜的,所以要用\(ci+s\)而不是\(s+ci\).

当\(l1\)或\(l2\)小于\(0\)时,即搜不到了,就返回,

而当\(l\)等于\(0\)时就添加答案并返回.

最后排序后输出就行了.

具体实现看代码吧:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std; inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} int f[101][101],tot=0;
char a[101],b[101];
int f1[27][101],f2[27][101];
string ans[1001]; void find(int l1,int l2,string s,int l){
if(l1<0||l2<0) return ;
if(l<=0){ans[++tot]=s;return ;}
for(int i=1;i<=26;i++){
int p1=f1[i][l1],p2=f2[i][l2];
if(f[p1][p2]!=l) continue;
char c=i+96;
find(p1-1,p2-1,c+s,l-1);
}
} int main(){
cin>>a>>b;
int la=strlen(a),lb=strlen(b);
for(int i=la;i;i--) a[i]=a[i-1];
for(int i=lb;i;i--) b[i]=b[i-1];//这两步是整体位移,个人习惯而已
for(int i=1;i<=26;i++){
for(int j=1;j<=la;j++){
if(a[j]==i+96) f1[i][j]=j;
else f1[i][j]=f1[i][j-1];
}
for(int j=1;j<=lb;j++){
if(b[j]==i+96) f2[i][j]=j;
else f2[i][j]=f2[i][j-1];
}
}//记录f1,f2
for(int i=1;i<=la;i++){
for(int 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-1][j-1]+1,f[i][j]);
}
}//寻找最长公共子序列
find(la,lb,"",f[la][lb]);
sort(ans+1,ans+tot+1);
for(int i=1;i<=tot;i++) cout<<ans[i]<<endl;
return 0;
}

题解 【POJ1934】 Trip的更多相关文章

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

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

  2. POJ1934 Trip 题解

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

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

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

  4. [POJ1934] Trip

    问题描述 Alice and Bob want to go on holiday. Each of them has planned a route, which is a list of citie ...

  5. SPOJ33&POJ1934 Trip LCS

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

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

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

  7. 常规DP专题练习

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

  8. [题解] trip

    题目大意 给定一颗大小为 \(N\) 的树, \(1\)的度数不小于 \(2\) .每个点有一个颜色,要么为黑色要么为白色. 从 \(1\) 号点开始游走,计数器初始为 \(0\). 如果当前为黑点计 ...

  9. Codeforces Round #365 (Div. 2) Mishka and trip

    Mishka and trip 题意: 有n个城市,第i个城市与第i+1个城市相连,他们边的权值等于i的美丽度*i+1的美丽度,有k个首都城市,一个首都城市与每个城市都相连,求所有边的权值. 题解: ...

随机推荐

  1. 【NOIP2015普及组】 推销员(纪中数据-标准)

    题目 [题目描述] 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住户到入口的距离为 ...

  2. centos7 使用nginx + tornado + supervisor搭建服务

    如何在Linux下部署一个简单的基于Nginx+Tornado+Supervisor的Python web服务. Tornado:官方介绍,是使用Python编写出来的一个极轻量级.高可伸缩性和非阻塞 ...

  3. Thinkphp5 自定义上传文件名

    这几天在做tp5的上传文件模块,项目需求是要把文件名在上传之后修改为 用户名+原文件名的组合形式,在网上找了一会儿发现好像没有类似的文章...只好自己去研究研究了. 之前查看过看云上面的官方手册,文件 ...

  4. HTML 标签的 for 属性

    HTML 标签的 for 属性 for 属性规定 label 与哪个表单元素绑定. 隐式和显式的联系 label通常以下面两种方式中的一种来和表单控件相联系: 将表单控件作为标记标签的内容,这样的就是 ...

  5. Ruby Rails学习中:调试信息和 Rails 的三种环境,Users 资源,调试器,Gravatar 头像和侧边栏

    注册 一.调试信息和 Rails 环境 现在咱们要实现的用户资料页面是我们这个应用中第一个真正意义上的动态页面.虽然视图的代码不会动态改变, 不过每个用户资料页面显示的内容却是从数据库中读取的.添加动 ...

  6. Mysql-Sqlalchemy-ORM-多外键关联

    创建表结构:orm_many_fk.py from sqlalchemy import Integer, ForeignKey, String, Column,create_engine from s ...

  7. node 环境安装

    记录一下, 方便自己需要时用, 免得到处找 1. 官网下载安装node(选择LTS长期支持版本), 一路点击next即可(傻瓜式安装) 2. 验证是否正确安装, 打开命令窗口, 执行 node -v ...

  8. C#面向对象22 委托事件反射

    1.委托的定义:声明委托类型(返回值和参数,命名空间中):定义委托对象 (把委托想象成函数中的占位符~因为你并不确定调用哪个函数~) using System; using System.Collec ...

  9. golang(9):网络编程 & redis

    网络编程 TCP/IP 协议: . TCP(传输控制协议) -- 应用程序之间通信 . UDP(用户数据包协议)-- 应用程序之间的简单通信 . IP(网际协议) -- 计算机之间的通信 . DHCP ...

  10. 实现a标签按钮完全禁用

    前言 最近在开发时遇见一个问题 我们知道a标签的disabled属性部分浏览器支持,但是尽管设置了disabled属性也无法阻挡任何鼠标经过或是点击事件的,那么如何实现a标签按钮的禁用呢? 转换一下思 ...