Codeforces Round #338 (Div. 2) C. Running Track dp
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的更多相关文章
- Codeforces Round #338 (Div. 2) B. Longtail Hedgehog dp
B. Longtail Hedgehog 题目连接: http://www.codeforces.com/contest/615/problem/B Description This Christma ...
- Codeforces Round #338 (Div. 2)
水 A- Bulbs #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1 ...
- Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...
- Codeforces Round #338 (Div. 2) E. Hexagons 讨论讨论
E. Hexagons 题目连接: http://codeforces.com/contest/615/problem/E Description Ayrat is looking for the p ...
- Codeforces Round #338 (Div. 2) D. Multipliers 数论
D. Multipliers 题目连接: http://codeforces.com/contest/615/problem/D Description Ayrat has number n, rep ...
- Codeforces Round #338 (Div. 2) A. Bulbs 水题
A. Bulbs 题目连接: http://www.codeforces.com/contest/615/problem/A Description Vasya wants to turn on Ch ...
- Codeforces Round #338 (Div. 2) D 数学
D. Multipliers time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Codeforces Round #338 (Div. 2) B dp
B. Longtail Hedgehog time limit per test 3 seconds memory limit per test 256 megabytes input standar ...
- 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 ...
随机推荐
- Delphi 异或,英文为exclusive OR,或缩写成xor
异或,英文为exclusive OR,或缩写成xor 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: a⊕b = (¬a ∧ b) ∨ ...
- Android百度地图开发(三)范围搜索
// 1.新建项目 将地图API添加进classpath中: 2.在activity_main.xml中添加一个MapView,用来显示地图: <LinearLayout xmlns:andro ...
- openGl从零开始之添加颜色
OpenGL 支持两种颜色模式:一种是 RGBA模式,一种是 颜色索引模式.无论哪种颜色模式,计算机都必须为每一个像素保存一些数据,即通过每一个像素的颜色,来改变整体图形的颜色.不同的是, RGBA ...
- PHPSTORM 与 Xdebug 配合调试
基本的配置可以参考网上的文档, 浏览器中装插件(xdebug)或直接在请求中加上如下的参数也可启动调试 ?XDEBUG_SESSION_START=PHPSTORM
- Python 学习笔记(六)正则扩展标记
1. (?:...) 不想保存括号里匹配项时使用 The (?:...) notation should be fairly popular; with it, you can groupparts ...
- Spring Batch的事务-Part 1:基础
原文 https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-1-the-basics/ This is th ...
- LINQ标准查询操作符(一)——select、SelectMany、Where、OrderBy、OrderByDescending、ThenBy、ThenByDescending和Reverse
一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: //查询语法 var query = fro ...
- delphi 集合
DELPHI没有JAVA的丰富的集合(SET MAP LIST),只有Tlist,可包装各种类型
- string 与char* char[]之间的转换 2015-04-09 11:30 29人阅读 评论(0) 收藏
1.首先必须了解,string可以被看成是以字符为元素的一种容器.字符构成序列(字符串).有时候在字符序列中进行遍历,标准的string类提供了STL容器接口.具有一些成员函数比如begin().en ...
- Codeforces Round #367 (Div. 2) C. Hard problem(DP)
Hard problem 题目链接: http://codeforces.com/contest/706/problem/C Description Vasiliy is fond of solvin ...