1. // powered by c++11
  2. // by Isaunoya
  3. #include<bits/stdc++.h>
  4. #define rep(i , x , y) for(register int i = (x) ; i <= (y) ; ++ i)
  5. #define Rep(i , x , y) for(register int i = (x) ; i >= (y) ; -- i)
  6. using namespace std ;
  7. using db = double ;
  8. using ll = long long ;
  9. using uint = unsigned int ;
  10. #define int long long
  11. using pii = pair < int , int > ;
  12. #define ve vector
  13. #define Tp template
  14. #define all(v) v.begin() , v.end()
  15. #define sz(v) ((int)v.size())
  16. #define pb emplace_back
  17. #define fir first
  18. #define sec second
  19. // the cmin && cmax
  20. Tp < class T > void cmax(T & x , const T & y) { if(x < y) x = y ; }
  21. Tp < class T > void cmin(T & x , const T & y) { if(x > y) x = y ; }
  22. // sort , unique , reverse
  23. Tp < class T > void sort(ve < T > & v) { sort(all(v)) ; }
  24. Tp < class T > void unique(ve < T > & v) { sort(all(v)) ; v.erase(unique(all(v)) , v.end()) ; }
  25. Tp < class T > void reverse(ve < T > & v) { reverse(all(v)) ; }
  26. const int SZ = 0x191981 ;
  27. struct FILEIN {
  28. ~ FILEIN () {} char qwq[SZ] , * S = qwq , * T = qwq , ch ;
  29. char GETC() { return (S == T) && (T = (S = qwq) + fread(qwq , 1 , SZ , stdin) , S == T) ? EOF : * S ++ ; }
  30. FILEIN & operator >> (char & c) { while(isspace(c = GETC())) ; return * this ; }
  31. FILEIN & operator >> (string & s) {
  32. while(isspace(ch = GETC())) ; s = ch ;
  33. while(! isspace(ch = GETC())) s += ch ; return * this ;
  34. }
  35. Tp < class T > void read(T & x) {
  36. bool sign = 1 ; while((ch = GETC()) < 0x30) if(ch == 0x2d) sign = 0 ;
  37. x = (ch ^ 0x30) ; while((ch = GETC()) > 0x2f) x = x * 0xa + (ch ^ 0x30) ;
  38. x = sign ? x : -x ;
  39. }
  40. FILEIN & operator >> (int & x) { return read(x) , * this ; }
  41. FILEIN & operator >> (signed & x) { return read(x) , * this ; }
  42. FILEIN & operator >> (unsigned & x) { return read(x) , * this ; }
  43. } in ;
  44. struct FILEOUT { const static int LIMIT = 0x114514 ;
  45. char quq[SZ] , ST[0x114] ; signed sz , O ;
  46. ~ FILEOUT () { sz = O = 0 ; }
  47. void flush() { fwrite(quq , 1 , O , stdout) ; fflush(stdout) ; O = 0 ; }
  48. FILEOUT & operator << (char c) { return quq[O ++] = c , * this ; }
  49. FILEOUT & operator << (string str) {
  50. if(O > LIMIT) flush() ; for(char c : str) quq[O ++] = c ; return * this ;
  51. }
  52. Tp < class T > void write(T x) {
  53. if(O > LIMIT) flush() ; if(x < 0) { quq[O ++] = 0x2d ; x = -x ; }
  54. do { ST[++ sz] = x % 0xa ^ 0x30 ; x /= 0xa ; } while(x) ;
  55. while(sz) quq[O ++] = ST[sz --] ; return ;
  56. }
  57. FILEOUT & operator << (int x) { return write(x) , * this ; }
  58. FILEOUT & operator << (signed x) { return write(x) , * this ; }
  59. FILEOUT & operator << (unsigned x) { return write(x) , * this ; }
  60. } out ;
  61. const int maxl = 152 ;
  62. const int maxs = 32 ;
  63. const int maxp = 22 ;
  64. int n , m ;
  65. int len[maxs] , mx = 0 ;
  66. char s[maxl] , ch[maxs][maxp] ;
  67. bool f[maxl][maxs][maxp] , c[maxl][maxl] ;
  68. int ans[maxl] ;
  69. signed main() {
  70. #ifdef _WIN64
  71. freopen("testdata.in" , "r" , stdin) ;
  72. #else
  73. ios_base :: sync_with_stdio(false) ;
  74. cin.tie(nullptr) , cout.tie(nullptr) ;
  75. #endif
  76. // code begin.
  77. scanf("%s" , s + 1) ;
  78. n = strlen(s + 1) ;
  79. scanf("%d" , & m) ;
  80. for(int i = 1 ; i <= m ; i ++) {
  81. scanf("%s" , ch[i] + 1) ;
  82. len[i] = strlen(ch[i] + 1) ;
  83. }
  84. for(int i = 1 ; i <= m ; i ++) {
  85. cmax(mx , len[i]) ;
  86. }
  87. for(int i = n ; i ; i --) {
  88. memset(f , 0 , sizeof(f)) ;
  89. for(int j = 1 ; j <= m ; j ++)
  90. f[i - 1][j][0] = 1 ;
  91. for(int j = i ; j <= n ; j ++) {
  92. for(int k = 1 ; k <= m ; k ++)
  93. for(int l = 1 ; l <= len[k] ; l ++)
  94. if(s[j] == ch[k][l])
  95. f[j][k][l] |= f[j - 1][k][l - 1] ;
  96. for(int qwq = j ; qwq <= n ; qwq ++)
  97. if(c[j][qwq])
  98. for(int k = 1 ; k <= m ; k ++)
  99. for(int l = 0 ; l <= mx ; l ++)
  100. f[qwq][k][l] |= f[j - 1][k][l] ;
  101. }
  102. for(int j = i ; j <= n ; j ++) {
  103. for(int k = 1 ; k <= m ; k ++)
  104. if(f[j][k][len[k]])
  105. c[i][j] = 1 ;
  106. }
  107. }
  108. for(int i = 1 ; i <= n ; i ++) {
  109. ans[i] = ans[i - 1] + 1 ;
  110. for(int j = 1 ; j <= i ; j ++)
  111. if(c[j][i])
  112. cmin(ans[i] , ans[j - 1]) ;
  113. }
  114. out << ans[n] << '\n' ;
  115. return out.flush() , 0 ;
  116. // code end.
  117. }

BZOJ#2121. 字符串游戏 [区间dp]的更多相关文章

  1. BZOJ 2121: 字符串游戏 区间DP + 思维

    Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...

  2. 【bzoj2121】字符串游戏 区间dp

    题目描述 给你一个字符串L和一个字符串集合S,如果S的某个子串在S集合中,那么可以将其删去,剩余的部分拼到一起成为新的L串.问:最后剩下的串长度的最小值. 输入 输入的第一行包含一个字符串,表示L. ...

  3. BZOJ 1090 字符串折叠(区间DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1090 题意:字符串AAAAAAAAAABABABCCD的最短折叠为9(A)3(AB)CC ...

  4. BZOJ2121: 字符串游戏(DP)(字符串删单词,求最多可以删去多少)

    2121: 字符串游戏 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 672  Solved: 376[Submit][Status][Discuss ...

  5. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  6. 【BZOJ-1090】字符串折叠 区间DP + Hash

    1090: [SCOI2003]字符串折叠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1127  Solved: 737[Submit][Stat ...

  7. 洛谷P4302 [SCOI2003]字符串折叠(区间dp)

    题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...

  8. BZOJ 1055 玩具取名(区间DP)

    很显然的区间DP,定义dp[i][j][k], 如果dp[i][j][k]=1表示字符串[i,j]可以组成k字符. # include <cstdio> # include <cst ...

  9. bzoj 1068 [SCOI2007]压缩 区间dp

    [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1644  Solved: 1042[Submit][Status][Discu ...

随机推荐

  1. java11类和对象

    import java.util.Scanner; public class jh_01_如何认识事物 { public static void main(String[] args) { Scann ...

  2. MSFVENOM SHELLCODE生成备忘录

    MSFVENOM SHELLCODE生成 通用Shellcode msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHO ...

  3. OSCP收集

    推荐书籍: 渗透测试:黑客动手入门(+强烈推荐初学者) 黑客:剥削的艺术,第二版 Rtfm:Red Team Field手册 Web应用程序黑客手册:查找和利用安全漏洞 黑客手册:实用指南渗透测试 基 ...

  4. JMeter接口测试-如何循环使用接口返回的多值?

    前言 在用JMeter做接口测试的时候,经常会遇到这样一种情况:一个接口请求返回了多个值,然后下一个接口想循环使用前一个接口的返回值:第二种情况:只想循环请求前一个接口返回值中的随机不定长度的某一些值 ...

  5. CommunityServer的编译

    1. 简介 Community Server是一个免费的开源协作系统,用于管理文档.项目.客户关系和电子邮件通信,可以在私有服务器上安装和配置.它的组成分为: 1. OnlyOfficeJabber  ...

  6. .Net core webapi使用httpClient发送异步请求遇到TaskCanceledException: A task was canceled

    前言:本人最近较多使用.net core的项目,最近在使用httpClient发送请求的时候,遇到服务器处理时间较长时,就老是会报异常:TaskCanceledException: A task wa ...

  7. SAP 如何看某个TR是否传入了Q或者P系统?

    SAP 如何看某个TR是否传入了Q或者P系统? 两种方式可以查询. 1)进入Q系统或者P系统.SE16,看表TPALOG, 输入请求号码, 执行,看记录里的字段TPSTAT_KEY是否为空,如果不为空 ...

  8. 「Flink」配置使用Flink调试WebUI

    很多时候,我们在IDE中编写Flink代码,我们希望能够查看到Web UI,从而来了解Flink程序的运行情况.按照以下步骤操作即可,亲测有效. 1.添加Maven依赖 <dependency& ...

  9. C#中的WinFrom技术实现串口通讯助手(附源码)

    C#中的WinFrom技术实现串口通讯助手(附源码)   实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口 ...

  10. nCompass-产品配置基础

    nCompass-产品配置基础 设备上架后,浏览器登陆设备的管理IP,输入用户名和密码, 登入进入视图展示页面 1. 添加许可 新设备上架之后,要添加许可方能使用. 步骤: 系统设置 --- 许可-- ...