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 ...
随机推荐
- 【Mongo】MongoVUE的使用
我一直是在终端操作的mongo,各种update set remove insert,后来查了下有个叫mongoVUE的客户端,界面化比较方便操作吧~ 网上搜了下,说MongoVUE已经n年没有更新了 ...
- Mountain Road
题意: n个车,过一条路,有不同的方向,路上不允许同时有两个方向的车,给出每个车的起始时间,方向,和经过路花费的时间,车最小间隔10个时间,求最后一个车通过路的最早的时间. 分析: dp[i][j][ ...
- hdu 5254 水题
纯暴力就能过的,可是题目描述真心不清楚,我看了好久好久才明白题目啥意思. 为了迅速打完,代码比较冗余. /* * Author : ben */ #include <cstdio> #in ...
- Sikuli简介
Sikuli是利用屏幕上能够看到的图型做自动化,能够通过这个手段来识别和控制元素,非常适合和Selenium和Robot Framework一起结合起来做自动化. 1.Sikuli主页 http:// ...
- android 性能优化大纲
性能优化系列 分为三个部分:视图篇 逻辑篇 和代码规范篇 . ------2016/9/6 视图篇 主要涵盖视图树层级优化.自定义视图.图片优化,常用布局性能缺陷等多个方面 .把平常经常 ...
- string中的substr() 和 find() 函数
string问题中经常遇到在stringA中查找stringB,主要通过substr()跟find()来完成 substr().find().replace() 都可以用一个位置加上一个长读去描述子串 ...
- C++抽象机制之二:运算符重载
1.二元运算符aa@bb,可以定义为 1).一个参数的非静态成员函数:aa.operator@(bb); (成员函数有this指针) 2). 两个参数的非成员函数:operator@(aa,bb); ...
- jQuery hover demo
先放效果图: 百度云下载地址:http://pan.baidu.com/s/1dDpn1Sl 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTM ...
- SharePoint咨询师之路:备份和恢复系列--制定备份计划
本来想研究下如何做数据库服务器的集群,然而突然被同事问起如何在部署SharePoint服务场的时候做备份和恢复的计划,就先来复习和研究一下. 本系列包括: 备份服务器场和配置 备份web和服务应用程序 ...
- HD2058The sum problem
The sum problem Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...