题目大概说给两个串,问最少要用多少个第一个串的子串(可以翻转)拼成第二个串。

UVa1401,一个道理。。dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. using namespace std;
  4. #define MAXN 2222*2000
  5.  
  6. int tn,ch[MAXN][],from[MAXN],to[MAXN];
  7.  
  8. char T[],S[];
  9. int d[],rec[];
  10. void pnt(int x){
  11. if(x<=) return;
  12. pnt(x-abs(from[rec[x]]-to[rec[x]])-);
  13. printf("%d %d\n",to[rec[x]],from[rec[x]]);
  14. }
  15. int main(){
  16. scanf("%s%s",T+,S+);
  17. int i;
  18. for(i=; T[i]; ++i){
  19. int x=;
  20. for(int j=i; T[j]; ++j){
  21. int y=T[j]-'a';
  22. if(ch[x][y]==) ch[x][y]=++tn;
  23. x=ch[x][y];
  24. from[x]=i; to[x]=j;
  25. }
  26. }
  27. for(--i; i>=; --i){
  28. int x=;
  29. for(int j=i; j>=; --j){
  30. int y=T[j]-'a';
  31. if(ch[x][y]==) ch[x][y]=++tn;
  32. x=ch[x][y];
  33. from[x]=i; to[x]=j;
  34. }
  35. }
  36. rec[]=;
  37. for(i=; S[i]; ++i){
  38. int x=;
  39. for(int j=i; j>=; --j){
  40. int y=S[j]-'a';
  41. if(ch[x][y]==) break;
  42. x=ch[x][y];
  43. if(rec[j-]){
  44. if(d[i]== || d[i]>d[j-]+){
  45. d[i]=d[j-]+;
  46. rec[i]=x;
  47. }
  48. }
  49. }
  50. }
  51. if(d[i-]==){
  52. printf("-1");
  53. return ;
  54. }
  55. printf("%d\n",d[i-]);
  56. pnt(i-);
  57. return ;
  58. }

Codeforces 615C Running Track(DP + Trie树)的更多相关文章

  1. Codeforces 633C Spy Syndrome 2 | Trie树裸题

    Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...

  2. 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 ...

  3. UVa1401 Remember the Word(DP+Trie树)

    题目给定一个字符串集合有几种方式拼成一个字符串. dp[i]表示stri...strlen-1的方案数 dp[len]=1 dp[i]=∑dp[j](stri...strj-1∈SET) 用集合的字符 ...

  4. 洛谷:P2292 [HNOI2004]L语言(DP+Trie树)

    P2292 [HNOI2004]L语言 题目链接:https://www.luogu.org/problemnew/show/P2292 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有 ...

  5. UVALive - 3942 (DP + Trie树)

    给出一个长度不超过300000的字符串 S,然后给出 n 个长度不超过100的字符串. 如果字符串可以多次使用,用这 n 个字符串组成 S 的方法数是多少? 比如样例中,abcd = a + b + ...

  6. HNU 13108 Just Another Knapsack Problem DP + Trie树优化

    题意: 给你一个文本串,和一些模式串,每个模式串都有一个价值,让你选一些模式串来组成文本串,使获得的价值最大.每个模式串不止能用一次. 思路: 多重背包,枚举文本串的每个位置和模式串,把该模式串拼接在 ...

  7. Codeforces 852G Bathroom terminal 【Trie树】

    <题目链接> 题目大意: 现在给定出n个字符串,并且进行m此询问,每次询问给出一个匹配串,每次询问都给出该匹配串能够匹配的字符串个数(题目只出现字符'a'~'e').'?'可以看成任意字符 ...

  8. codeforces 665E E. Beautiful Subarrays(trie树)

    题目链接: E. Beautiful Subarrays time limit per test 3 seconds memory limit per test 512 megabytes input ...

  9. Codeforces 633C Spy Syndrome 2(DP + Trie树)

    题目大概说给一个加密的字符串,加密规则是把原文转化成小写字母,然后各个单词反转,最后去掉空格.现在给几个已知的单词,还原加密的字符串. 和UVa1401一个道理.. 用dp[i]表示加密字符前i个字符 ...

随机推荐

  1. Mysql基于GTIDs的复制

    通过GTIDs[global transaction identifiers],可以标识每一个事务,并且可以在其一旦提交追踪并应用于任何一个Slave上:这样 就不需要像BinaryLog复制依赖Lo ...

  2. Android四种LaunchMode

    singleTop 的Activity和standard的几乎一样, 把singleTop和standard归为一类启动模式,这种模式不会引起任务栈的变更 singleTop和standard唯一的区 ...

  3. NYOJ之水仙花数

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsAAAAInCAIAAAAZDHiCAAAgAElEQVR4nO3dPVLjzNoG4G8T5CyEFC

  4. Hadoop家族 路线图(转)

    主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项 ...

  5. python中使用sub替换字符串中的元素

  6. MYSQL的增删改查语句样码

    慢慢来,慢慢来.. 增: INSERT INTO person (person_id, fname, lname, gender, birth_date) VALUES (null, 'William ...

  7. 攻城狮在路上(肆)How tomcat works(一) 简单的web服务器

     该节总共三个类:Request\Response\HttpServer---user.dir     该节的目的是实现简单web服务器对静态文件的访问.需要对请求头.请求体的格式有所了解,不然就没有 ...

  8. Linux环境下stl库使用(vector)

    step1: #include <iostream> #include <vector> #include <string> using namespace std ...

  9. Oracle 备份与恢复介绍

    一.Oracle备份方式分类:Oracle有两类备份方式:(1)物理备份:是将实际组成数据库的操作系统文件从一处拷贝到另一处的备份过程,通常是从磁盘到磁带.物理备份又分为冷备份.热备份:   (2)逻 ...

  10. 如何在java程序中调用linux命令或者shell脚本

    转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...