<span>Atcoder F - LCS (DP-最长公共子序列,输出字符串)</span>

F - LCS


Time Limit: 2 sec / Memory Limit: 1024 MB

Score : <var>100100</var> points

Problem Statement

You are given strings <var>ss</var> and <var>tt</var>. Find one longest string that is a subsequence of both <var>ss</var> and <var>tt</var>.

Notes

subsequence of a string <var>xx</var> is the string obtained by removing zero or more characters from <var>xx</var> and concatenating the remaining characters without changing the order.

Constraints

  • <var>ss</var> and <var>tt</var> are strings consisting of lowercase English letters.
  • <var>1|s|,|t|30001≤|s|,|t|≤3000</var>

Input

Input is given from Standard Input in the following format:

<var>ss</var>
<var>tt</var>

Output

Print one longest string that is a subsequence of both <var>ss</var> and <var>tt</var>. If there are multiple such strings, any of them will be accepted.


Sample Input 1 Copy

Copy
axyb
abyxb

Sample Output 1 Copy

Copy
axb

The answer is axb&nbs***bsp;ayb; either will be accepted.


Sample Input 2 Copy

Copy
aa
xayaz

Sample Output 2 Copy

Copy
aa

Sample Input 3 Copy

Copy
a
z

Sample Output 3 Copy

Copy

The answer is  (an empty string).


Sample Input 4 Copy

Copy
abracadabra
avadakedavra

Sample Output 4 Copy

Copy
aaadara


题意:给定两个字符串s和t,让你求出这两个字符串的最长公共子序列,并输出最长公共子序列。
思路:先通过DP求出LCS的DP信息,然后再根据DP信息输出对应的字符。
裸题主要看思路。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
using namespace std;
typedef long long ll;
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int dp[3050][3050];
char a[maxn];
char b[maxn];
int n,m;
int c[maxn];
int pre[maxn];
int lis[maxn];
int main()
{
    scanf("%s",a);
    scanf("%s",b);
    n=strlen(a);
    m=strlen(b);
    for(int i=n-1;i>=0;i--)
    {
        for(int j=m-1;j>=0;j--)
        {
            if(a[i]==b[j])
            {
                dp[i][j]=dp[i+1][j+1]+1;
            }else
            {
                dp[i][j]=max(dp[i+1][j],dp[i][j+1]);
            }
        }
    }
//    cout<<dp[n-1][m-1]<<endl;
    int i=0;
    int j=0;
    while(i<n&&j<m)
    {
        if(a[i]==b[j])
        {
            putchar(a[i]);
            i++;
            j++;
        }else if(dp[i][j]==dp[i+1][j])
        {
            i++;
        }else
        {
            j++;
        }
    }

    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}

 

 

全部评论

相关推荐

宝宝,你只是华为鱼池里的一条鱼,一滴泪落入大海没有人会看见。➡️4.5投递简历➡️5.15-5.31完成所有面试,并显示通过入池➡️6月初我同步收到其他公司暑期实习offer,但由于当时1️⃣对华为的爱国滤镜+2️⃣当时不知道华为臭名昭著的泡池子体系,且3️⃣问了对接HR是否面试全通过就能往后推进流程,HR的回复是肯定的,且保证有最新消息会及时通知。➡️所以不想耽误其他公司招聘进度,就把目前手上offer全拒了,等华为这边推进度。直到目前为止,再没收到过任何保温、甚至来自HR提醒(没有我也认了,没义务主动提醒我),但是最生气的是我主动和HR连发三次消息连敷衍都没有,但同天有朋友是同一个HR对接,问消息ta又都有回复。最后只有我傻傻地我守着一张空头支票,结果开票的人压根就没当一回事。PS:今天要了另一个Hr电话致电问询,说话帮我查下什么情况,但下午打过去电话直接被挂了,至此我已我能做的所有事情,反正也只能如此,以这个帖子记录和结束🔚现在已经不奢望被捞了,只是没想到自己为暑期实习忙活整整两个月得到的是这么个结果,刚好最近在听《平凡的世界》,应景极了。能怎么办呢,收拾心情,接着忙开题答辩和再找实习吧。起码不是秋招中被耍,就当吃一堑长一智吧#实习吐槽# #暑期实习# #踩雷# #华为# #菊厂# #小丑竟是我自己#
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务