Codeforces 615C Running Track(DP + Trie树)
2016-07-17 09:24
302 查看
题目大概说给两个串,问最少要用多少个第一个串的子串(可以翻转)拼成第二个串。
UVa1401,一个道理。。dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移。
UVa1401,一个道理。。dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移。
#include<cstdio> #include<cstdlib> using namespace std; #define MAXN 2222*2000 int tn,ch[MAXN][26],from[MAXN],to[MAXN]; char T[2222],S[2222]; int d[2222],rec[2222]; void pnt(int x){ if(x<=0) return; pnt(x-abs(from[rec[x]]-to[rec[x]])-1); printf("%d %d\n",to[rec[x]],from[rec[x]]); } int main(){ scanf("%s%s",T+1,S+1); int i; for(i=1; T[i]; ++i){ int x=0; for(int j=i; T[j]; ++j){ int y=T[j]-'a'; if(ch[x][y]==0) ch[x][y]=++tn; x=ch[x][y]; from[x]=i; to[x]=j; } } for(--i; i>=1; --i){ int x=0; for(int j=i; j>=1; --j){ int y=T[j]-'a'; if(ch[x][y]==0) ch[x][y]=++tn; x=ch[x][y]; from[x]=i; to[x]=j; } } rec[0]=1; for(i=1; S[i]; ++i){ int x=0; for(int j=i; j>=1; --j){ int y=S[j]-'a'; if(ch[x][y]==0) break; x=ch[x][y]; if(rec[j-1]){ if(d[i]==0 || d[i]>d[j-1]+1){ d[i]=d[j-1]+1; rec[i]=x; } } } } if(d[i-1]==0){ printf("-1"); return 0; } printf("%d\n",d[i-1]); pnt(i-1); return 0; }
相关文章推荐
- IPTV2.0测试用例
- JAVA AIO例子
- iOS 启动引导页面
- Ubuntu安装“启动引导器”的设备选哪一项,选默认还是选/boot分区?
- visual assist x 代码颜色失效解决办法
- Crazy Rows————GCJ 2009 Round2A(简单贪心)
- OTT业务测试用例(2.1.0完整版)
- 解决VirtualBox只能安装32位系统的问题
- 两种方法教你在Ubuntu下轻松关闭触摸板(TinkPad)
- Wifi小车之 - 51单片机无线小车篇
- opencv3接收rtsp网络视频流
- yum 源 (2)
- HDMI 2.0概述
- JAVA NIO例子
- win10背景色改成豆沙绿 锁屏后失效修改方式
- OTT业务开放平台介绍
- Android开发——查询/卸载手机里的应用、应用图标创建
- Longest Increasing Subsequence -- Leetcode
- Android开发——查询/卸载手机里的应用、应用图标创建
- declare和typeset DEMO