HDU 1503 带回朔路径的最长公共子串
http://acm.hdu.edu.cn/showproblem.php?pid=1503
这道题又WA了好几次
在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个
不同的标记。dp[n][m]开始回找,找到这条最长串的组成。
WA点有几个都被我遇到了
一个是最长公共串为0时,两个串直接输出
一个是最长公共串为1时,后续串的处理
这里要记得是dp回溯的方式
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<stack>
#include<cstring>
using namespace std;
struct donser
{
int x,y;
};
int main()
{
string s,t;
while(cin>>s>>t)
{
int i,j,m=,n=,a1,b1,a2,b2;
stack<donser> sta;
struct donser dong;
struct donser dongs;
int dp[][],lable[][];
n=s.length();
m=t.length();
for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
if(s[i]==t[j])
{
dp[i+][j+]=dp[i][j]+;
lable[i+][j+]=;
}
else
{
if(dp[i][j+]>dp[i+][j])
{
dp[i+][j+]=dp[i][j+];
lable[i+][j+]=;
}
else
{
dp[i+][j+]=dp[i+][j];
lable[i+][j+]=;
}
}
}
}
i=n;j=m;a1=a2=n;b1=b2=m;
if(dp[n][m]==){cout<<s<<t<<endl;}
else{
while(lable[i][j]!=)
{
if(lable[i][j]==)
{
i--;j--;
dong.x=i;
dong.y=j;
sta.push(dong);
}
else if(lable[i][j]==)
{
i--;
}
else if(lable[i][j]==)
{
j--;
}
}
if(sta.empty()!=)
{
dong=sta.top();
sta.pop();
a1=dong.x;
b1=dong.y;
for(i=;i<a1;i++)
{
cout<<s[i];
}
for(i=;i<b1;i++)
{
cout<<t[i];
}
}
if(sta.empty()==)
{
for(i=a1;i<n;i++)
{
cout<<s[i];
}
for(i=b1+;i<m;i++)
{
cout<<t[i];
}
}
while(sta.empty()!=)
{
a1=dong.x;
b1=dong.y;
dongs=sta.top();
sta.pop();
a2=dongs.x;
b2=dongs.y;
for(i=a1;i<a2;i++)
{
cout<<s[i];
}
for(j=b1+;j<b2;j++)
{
cout<<t[j];
}
dong=dongs;
}
for(i=a2;i<n;i++)
{
cout<<s[i];
}
for(i=b2+;i<m;i++)
{
cout<<t[i];
}
cout<<endl;}
}
return ;
}
HDU 1503 带回朔路径的最长公共子串的更多相关文章
- HDU 1403 Longest Common Substring(最长公共子串)
http://acm.hdu.edu.cn/showproblem.php?pid=1403 题意:给出两个字符串,求最长公共子串的长度. 思路: 刚开始学后缀数组,确实感觉很难,但是这东西很强大,所 ...
- HDU 1403 Longest Common Substring(后缀数组,最长公共子串)
hdu题目 poj题目 参考了 罗穗骞的论文<后缀数组——处理字符串的有力工具> 题意:求两个序列的最长公共子串 思路:后缀数组经典题目之一(模版题) //后缀数组sa:将s的n个后缀从小 ...
- HDU 1423 Greatest Common Increasing Subsequence(最长公共上升LCIS)
HDU 1423 Greatest Common Increasing Subsequence(最长公共上升LCIS) http://acm.hdu.edu.cn/showproblem.php?pi ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- DP:LCS(最长公共子串、最长公共子序列)
1. 两者区别 约定:在本文中用 LCStr 表示最长公共子串(Longest Common Substring),LCSeq 表示最长公共子序列(Longest Common Subsequence ...
- 最长公共子序列&最长公共子串
首先区别最长公共子串和最长公共子序列 LCS(计算机科学算法:最长公共子序列)_百度百科 最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 最长公共子序列: http ...
- BZOJ 2946 POI2000 公共串 后缀自动机(多串最长公共子串)
题意概述:给出N个字符串,每个串的长度<=2000(雾...可能是当年的年代太久远机子太差了),问这N个字符串的最长公共子串长度为多少.(N<=5) 抛开数据结构,先想想朴素做法. 设计一 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 最长公共子序列PK最长公共子串
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...
随机推荐
- Win8.1微软官方最终正式版ISO镜像文件
Win8.1微软官方最终正式版ISO镜像文件 经过预览版,测试版.开发版本等几个乱七八糟的版本后,2013年10月17日,微软终于如约的发布了Win8.1最终正式版. Win8.1和win8的区别 1 ...
- vim 快捷键 以及技巧
[root@centos01 biji]# vim + 1.txt 打开文件,光标定位到最后一行[root@centos01 biji]# vim +5 1.txt 打开文件,光标定位到第5行[roo ...
- Java数据结构——解析算术表达式
- Winsock 入门 Echo 示例
#include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32") /* Win ...
- yourphp超出20记录自动删除
$m = M('service_loginlog'); $res =$m->where('card_id='.$_SESSION['card_id'])->order('time desc ...
- owin中间件
public class HelloWorldOptions { public HelloWorldOptions() { IncludeTimestamp = true; Name = " ...
- Oracle的DBMS_OUTPUT.PUT_LINE用法及脚本批处理方法
打印至控制台(无显示): BEGIN DBMS_OUTPUT.PUT_LINE('Hey look, ma!'); END; / 打印至控制台(有显示): SET SERVEROUTPUT ON BE ...
- Java学习注意事项
一个Java文件中可以包含多个类. 如果有public类,则文件名必须和public类一样. 例如: class Pie { void f(){ System.out.println("Pi ...
- 关于Windows下安装mongodb和加入Windows系统启动项
.首先:在http://www.mongodb.org/downloads官网下载最新的win版本的mongodb下载包(我下载到d盘) .加压缩,修改文件夹名字为mongodb,建立放数据库文件夹w ...
- php后台多用户权限组思路与实现程序代码
网站开发少不了有网站后台,有了后台自然要对用户有同角色来分配一下,特别是多用户系统的情况下,如我一个系统要有多个管理员,那么我这些管理要分成,编辑,友情连接,管理员等,那我们要有权限和角色分配,今天我 ...