C. Running Track

题目连接:

http://www.codeforces.com/contest/615/problem/C

Description

A boy named Ayrat lives on planet AMI-1511. Each inhabitant of this planet has a talent. Specifically, Ayrat loves running, moreover, just running is not enough for him. He is dreaming of making running a real art.

First, he wants to construct the running track with coating t. On planet AMI-1511 the coating of the track is the sequence of colored blocks, where each block is denoted as the small English letter. Therefore, every coating can be treated as a string.

Unfortunately, blocks aren't freely sold to non-business customers, but Ayrat found an infinite number of coatings s. Also, he has scissors and glue. Ayrat is going to buy some coatings s, then cut out from each of them exactly one continuous piece (substring) and glue it to the end of his track coating. Moreover, he may choose to flip this block before glueing it. Ayrat want's to know the minimum number of coating s he needs to buy in order to get the coating t for his running track. Of course, he also want's to know some way to achieve the answer.

Input

First line of the input contains the string s — the coating that is present in the shop. Second line contains the string t — the coating Ayrat wants to obtain. Both strings are non-empty, consist of only small English letters and their length doesn't exceed 2100.

Output

The first line should contain the minimum needed number of coatings n or -1 if it's impossible to create the desired coating.

If the answer is not -1, then the following n lines should contain two integers xi and yi — numbers of ending blocks in the corresponding piece. If xi ≤ yi then this piece is used in the regular order, and if xi > yi piece is used in the reversed order. Print the pieces in the order they should be glued to get the string t.

Sample Input

abc

cbaabc

Sample Output

2

3 1

1 3

Hint

题意

给你一个字符串s,然后给你字符串t,让你用s中的子串来构成t。

并输出构造方案。

s可以旋转

题解:

我们可以直接跑dp,预处理dp1[i][j],表示匹配到s串的i位置,t串的j位置时候,最多可以往前跳dp1[i][j]个字符。

其实这个就是最长公共前缀的dp。

跑完之后,我们就可以跑第二个dp了,dp[i]表示以t的i位置结尾所需要的最少次数。

很显然dp[i] = max(dp[i],dp[i-dp1[j][i]]+1);

然后记录一下过程,倒着跑一下DP,把路径输出就好了。

代码

#include<bits/stdc++.h>
using namespace std;
#define maxn 3000
long long dp1[maxn][maxn];
long long dp2[maxn][maxn];
char a[maxn],b[maxn],c[maxn];
long long dp[maxn];
int step[maxn];
int ans[maxn][2];
int main()
{
scanf("%s%s",a+1,b+1);
int len1 = strlen(a+1);
int len2 = strlen(b+1);
for(int i=1;i<=len2;i++)
dp[i]=1e9;
for(int i=1;i<=len1;i++)
c[i]=a[len1-i+1];
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(a[i]==b[j])dp1[i][j]=dp1[i-1][j-1]+1;
if(b[j]==c[i])dp2[i][j]=dp2[i-1][j-1]+1;
}
}
for(int i=1;i<=len2;i++)
{
for(int j=1;j<=len1;j++)
{
if(dp1[j][i])
{
if(dp[i]>dp[i-dp1[j][i]]+1)
{
dp[i]=dp[i-dp1[j][i]]+1;
step[i]=i-dp1[j][i];
}
}
if(dp2[j][i])
{
if(dp[i]>dp[i-dp2[j][i]]+1)
{
dp[i]=dp[i-dp2[j][i]]+1;
step[i]=i-dp2[j][i];
}
}
}
}
if(dp[len2]==1e9)return puts("-1");
printf("%d\n",dp[len2]);
int sum = dp[len2];
int now = len2;
while(sum--)
{
for(int i=1;i<=len1;i++)
{
if(dp1[i][now]==now-step[now])
{
ans[sum][0]=i-dp1[i][now]+1,ans[sum][1]=i;
now = step[now];
break;
}
if(dp2[i][now]==now-step[now])
{
ans[sum][0]=len1-i+dp2[i][now],ans[sum][1]=len1-i+1;
now = step[now];
break;
}
}
}
for(int i=0;i<dp[len2];i++)
printf("%d %d\n",ans[i][0],ans[i][1]);
}

Codeforces Round #338 (Div. 2) C. Running Track dp的更多相关文章

  1. Codeforces Round #338 (Div. 2) B. Longtail Hedgehog dp

    B. Longtail Hedgehog 题目连接: http://www.codeforces.com/contest/615/problem/B Description This Christma ...

  2. Codeforces Round #338 (Div. 2)

    水 A- Bulbs #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1 ...

  3. Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)

    题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...

  4. Codeforces Round #338 (Div. 2) E. Hexagons 讨论讨论

    E. Hexagons 题目连接: http://codeforces.com/contest/615/problem/E Description Ayrat is looking for the p ...

  5. Codeforces Round #338 (Div. 2) D. Multipliers 数论

    D. Multipliers 题目连接: http://codeforces.com/contest/615/problem/D Description Ayrat has number n, rep ...

  6. Codeforces Round #338 (Div. 2) A. Bulbs 水题

    A. Bulbs 题目连接: http://www.codeforces.com/contest/615/problem/A Description Vasya wants to turn on Ch ...

  7. Codeforces Round #338 (Div. 2) D 数学

    D. Multipliers time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  8. Codeforces Round #338 (Div. 2) B dp

    B. Longtail Hedgehog time limit per test 3 seconds memory limit per test 256 megabytes input standar ...

  9. Codeforces Round #338 (Div. 2) B. Longtail Hedgehog 记忆化搜索/树DP

    B. Longtail Hedgehog   This Christmas Santa gave Masha a magic picture and a pencil. The picture con ...

随机推荐

  1. slowhttps安装及使用心得

    运行及安装环境,kali. 到googlecode上下载安装包,cd到安装目录./configure 运行完毕后输入make 结束后make install 简单点就直接apt-get install ...

  2. eclipse 报错汇总

    1.Eclipse 启动时,报错: Fail to create the java virtual machine   已解决.方法:eclipse.ini 中-vmargs-Dosgi.requir ...

  3. 任务(Tasks)

    在Eclipse中用TODO标签管理任务,利用这个功能可以方便地将项目中一些需要处理的任务记录下来.我们可以通过在java注释里添加任务标签来标记一个任务,任务可以通过Tasks(任务)视图来察看. ...

  4. [转] Web前端优化之 CSS篇

    原文链接: http://lunax.info/archives/3097.html Web 前端优化最佳实践第四部分面向 CSS.目前共计有 6 条实践规则.另请参见 Mozilla 开发者中心的文 ...

  5. Array.prototype.slice.call

    Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组 ,::'age'}; Array.prototype.slice.call(arr); ...

  6. Spark on Yarn遇到的几个问题

    1 概述 Spark的on Yarn模式,其资源分配是交给Yarn的ResourceManager来进行管理的,但是目前的Spark版本,Application日志的查看,只能通过Yarn的yarn ...

  7. 编译python3

    安装环境 yum install gcc yum install zlib-devel yum install make 下载python版本 wget http://www.python.org/f ...

  8. 第二百三十五天 how can I 坚持

    其实昨天听遗憾的,尽头看了新闻,有好多人都出去赏雪了,可惜了,最遗憾的是没有叫上你一块去. 晚上喝了点酒,抽了两根烟,以前基本不喝酒,就别提抽烟了,陈小春的<算你狠>,该如何是好. 经常在 ...

  9. 什么是ADB

    ADB, Android Debug Bridge, 是一个client-server程序,可以用来和安卓设备交流 Client: 用来发送命令的,client运行在开发机器上(电脑cmd, adb ...

  10. 树上的DP

    CF#196B http://codeforces.com/contest/338/problem/B 题意:在一颗树上,给m个点,求到所有m个点距离不超过d的点的个数,所有路径长度为1. 分析:问题 ...