题目链接

洛谷P4608

题解

建个序列自动机后

第一问暴搜

第二问dp + 高精

设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\)

由于空间卡的很紧,高精不仅要压位,还要动态开内存

由于有些状态是没用的,记忆化搜索以减少内存损失

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<map>
  7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  8. #define REP(i,n) for (int i = 1; i <= (n); i++)
  9. #define mp(a,b) make_pair<int,int>(a,b)
  10. #define cls(s) memset(s,0,sizeof(s))
  11. #define cp pair<int,int>
  12. #define LL long long int
  13. using namespace std;
  14. const int maxn = 3015,P = 1000000000,maxm = 100005,INF = 1000000000;
  15. inline int read(){
  16. int out = 0,flag = 1; char c = getchar();
  17. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  18. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  19. return out * flag;
  20. }
  21. char X[maxn],Y[maxn];
  22. int typ,n,m,last[60];
  23. inline int id(char c){return c >= 'a' ? 26 + c - 'a' : c - 'A';}
  24. struct LAM{
  25. int ch[maxn][52],cnt;
  26. void build(char* S,int len){
  27. for (int i = 0; i < 52; i++) last[i] = 0;
  28. cnt = len;
  29. for (int i = len; i; i--){
  30. for (int j = 0; j < 52; j++)
  31. ch[i][j] = last[j];
  32. last[id(S[i])] = i;
  33. }
  34. for (int i = 0; i < 52; i++) ch[0][i] = last[i];
  35. }
  36. }A,B;
  37. char s[maxn];
  38. int len,ans;
  39. void dfs(int u,int v){
  40. ans++;
  41. for (int i = 1; i <= len; i++) putchar(s[i]); puts("");
  42. for (int i = 0; i < 52; i++)
  43. if (A.ch[u][i] && B.ch[v][i]){
  44. s[++len] = i > 25 ? 'a' + i - 26 : 'A' + i;
  45. dfs(A.ch[u][i],B.ch[v][i]);
  46. len--;
  47. }
  48. }
  49. void work1(){
  50. dfs(0,0);
  51. printf("%d\n",ans);
  52. };
  53. struct NUM{
  54. int len;
  55. LL* s;
  56. void init(){
  57. s = new LL[20];
  58. for (int i = 0; i < 20; i++) s[i] = 0;
  59. len = 0;
  60. }
  61. void out(){
  62. if (!len){puts("0"); return;}
  63. printf("%lld",s[len - 1]);
  64. for (int i = len - 2; ~i; i--)
  65. printf("%09lld",s[i]);
  66. }
  67. void add(const NUM& a){
  68. LL carry = 0,tmp,L = max(len,a.len);
  69. for (int i = 0; i < L; i++){
  70. tmp = s[i] + a.s[i] + carry;
  71. s[i] = tmp % P;
  72. carry = tmp / P;
  73. }
  74. if (carry) s[L] += carry;
  75. len = 0;
  76. for (int i = 19; ~i; i--) if (s[i]){len = i + 1; break;}
  77. }
  78. }f[maxn][maxn];
  79. int vis[maxn][maxn];
  80. void DFS(int u,int v){
  81. if (vis[u][v]) return;
  82. vis[u][v] = true;
  83. f[u][v].init();
  84. f[u][v].s[0] = f[u][v].len = 1;
  85. for (int i = 0; i < 52; i++)
  86. if (A.ch[u][i] && B.ch[v][i]){
  87. DFS(A.ch[u][i],B.ch[v][i]);
  88. f[u][v].add(f[A.ch[u][i]][B.ch[v][i]]);
  89. }
  90. }
  91. void work2(){
  92. DFS(0,0);
  93. f[0][0].out();
  94. }
  95. int main(){
  96. n = read(); m = read();
  97. scanf("%s%s%d",X + 1,Y + 1,&typ);
  98. A.build(X,n); B.build(Y,m);
  99. if (typ) work1();
  100. else work2();
  101. return 0;
  102. }

洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】的更多相关文章

  1. 洛谷P3402 最长公共子序列

    题目背景 DJL为了避免成为一只咸鱼,来找Johann学习怎么求最长公共子序列. 题目描述 经过长时间的摸索和练习,DJL终于学会了怎么求LCS.Johann感觉DJL孺子可教,就给他布置了一个课后作 ...

  2. 洛谷P1439 最长公共子序列(LCS问题)

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  3. 洛谷 [p1439] 最长公共子序列 (NlogN)

    可以发现只有当两个序列中都没有重复元素时(1-n的排列)此种优化才是高效的,不然可能很不稳定. 求a[] 与b[]中的LCS 通过记录lis[i]表示a[i]在b[]中的位置,将LCS问题转化为最长上 ...

  4. LOJ 2172 「FJOI2016」所有公共子序列问题——序列自动机

    题目:https://loj.ac/problem/2172 在两个序列自动机上同时走,这样暴搜. 先走字典序小的字符,一边搜一边输出,就是按字典序排序的. 方案数很多,需要高精度?空间很小,要压位. ...

  5. 洛谷P4762 [CERC2014]Virus synthesis(回文自动机+dp)

    传送门 回文自动机的好题啊 先建一个回文自动机,然后记$dp[i]$表示转移到$i$节点代表的回文串的最少的需要次数 首先肯定2操作越多越好,经过2操作之后的串必定是一个回文串,所以最后的答案肯定是由 ...

  6. 序列自动机—— [FJOI2016]所有公共子序列问题

    序列自动机: 是一个处理子序列的自动机.就这样. 建造:(By猫老师:immoralCO猫) s[] next[][] memset(next[n], -, <<); for(int i ...

  7. 洛谷CF264D Colorful Stones(子序列匹配,思维)

    洛谷题目传送门 神仙思维题. 对于两个字符串的匹配问题,似乎之前蒟蒻写的HAOI2010最长公共子序列题解中提到的建网格图模型是一种套路? 给一个稍微强一点的样例(把字母换成了ABC) AABCB B ...

  8. [洛谷P4609] [FJOI2016]建筑师

    洛谷题目链接:[FJOI2016]建筑师 题目描述 小 Z 是一个很有名的建筑师,有一天他接到了一个很奇怪的任务:在数轴上建 \(n\) 个建筑,每个建筑的高度是 \(1\) 到 \(n\) 之间的一 ...

  9. 洛谷 P4609: [FJOI2016] 建筑师

    本省省选题是需要做的. 题目传送门:洛谷P4609. 题意简述: 求有多少个 \(1\) 到 \(N\) 的排列,满足比之前的所有数都大的数正好有 \(A\) 个,比之后的所有数都大的数正好有 \(B ...

随机推荐

  1. 我们一起学习WCF 第七篇会话模式

    会话:就是客户端和服务端之间的谈话.比喻A和B去登陆网站,那么A用户登陆进去肯定显示A的用户详情,那么这就是A和服务器之间的交流.同样B用户登陆之后显示B的详情,这就表示这是B和服务器之间的交流. 如 ...

  2. javaweb(十六)——JSP指令

    一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...

  3. nginx基础配置加基础实战演示

    目录 基本配置 设置用户 工作衍生进程数 错误日志存放路径 pid文件存放路径 设置最大连接数 http->server gzip 字符编码 nginx的基本格式 实战配置 虚拟主机配置 开始配 ...

  4. 测试面试必会sql(1)

    测试一般各种查询语句用的较多,下面的查询语句都是需要熟悉的 Course表 Score表 Student表 Teacher表 1,查询课程编号为“02”的总成绩 SELECT * FROM `Scor ...

  5. Scrapy爬去哪儿~上海一日游门票并存入MongoDB数据库

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZwAAAGGCAYAAABPDDfEAAAgAElEQVR4nOy9C3Rb1Z3/+z1Hkm35mT

  6. header field token is not allowed by Access-Control-Allow-Headers in preflight response问题解决

    今天下午,本来打算使用aioxs在header里传一个token给后台服务器,如下图所示: 结果,控制台报了如下的错: 然后,我不停地百度,不停的改后台express的header设置,一直没有效果: ...

  7. 简析Monte Carlo与TD算法的相关问题

    Monte Carlo算法是否能够做到一步更新,即在线学习? 答案显然是不能,如果可以的话,TD算法还有何存在的意义?MC算法必须要等到episode结束后才可以进行值估计的主要原因在于对Return ...

  8. JQuery 异步提交数据

    类别添加   名称:  &nbsp 正在发送数据请求… <% dim strValue blnLogin = false; strValue = request.Form("t ...

  9. win10 tomcat不能访问问题

    问题描述:电脑是Win10系统的,安装了Tomcat后,本机通过80端口能顺利访问.但局域网内的其他机器却无法访问这台电脑的Tomcat服务. 故障分析: 将防火墙关闭后,可以访问,所以问题就出在防火 ...

  10. ES6中Class的继承关系

    es5实现中,每个对象都有__proto__属性(也就是关系图中[[prototype]]属性),指向对应的构造函数的prototype.Class 作为构造函数的语法糖,同时有prototype属性 ...