题目:https://loj.ac/problem/2172

在两个序列自动机上同时走,这样暴搜。

先走字典序小的字符,一边搜一边输出,就是按字典序排序的。

方案数很多,需要高精度?空间很小,要压位。1e9的20位恰好够。

不开 n*n 的DP数组,给出现的状态分配一个位置,开 3e6 的DP数组,空间就能了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. using namespace std;
  6. const int N=,K=;
  7. int n,m,c[N][K],d[N][K],lst[K];
  8. char a[N],b[N];
  9. int Id(char ch)
  10. {
  11. if(ch<='Z')return ch-'A';
  12. return ch-'a'+;
  13. }
  14. char Id2(int k)
  15. {
  16. if(k<)return k+'A';
  17. return k-+'a';
  18. }
  19. namespace S1{
  20. int ans,top; char s[N];
  21. void dfs(int p0,int p1)
  22. {
  23. printf("%s\n",s+); ans++;
  24. for(int i=;i<;i++)
  25. if(c[p0][i]<=n&&d[p1][i]<=m)
  26. {
  27. s[++top]=Id2(i);
  28. dfs(c[p0][i],d[p1][i]);
  29. s[top]=s[top+];top--;
  30. }
  31. }
  32. void solve()
  33. {dfs(,); printf("%d\n",ans);}
  34. }
  35. namespace S2{
  36. const int M=3e6,bs=1e9;
  37. int tot; int dy[N][N];
  38. struct Node{
  39. int a[];//
  40. void Inc(int k)
  41. {
  42. a[]+=k;
  43. for(int i=;i<=a[];i++)
  44. if(a[i]>=bs)a[i]-=bs,a[i+]++;
  45. while(a[a[]+])a[]++;
  46. }
  47. void Inc(Node k)
  48. {
  49. int lm=max(a[],k.a[]);
  50. for(int i=;i<=lm;i++)
  51. {
  52. a[i]+=k.a[i];
  53. if(a[i]>=bs)a[i+]+=a[i]/bs,a[i]%=bs;
  54. }
  55. while(a[a[]+])a[]++;
  56. }
  57. void print()
  58. {
  59. printf("%d",a[a[]]);
  60. for(int i=a[]-;i;i--)
  61. printf("%09d",a[i]);puts("");
  62. }
  63. }dp[M];
  64. int dfs(int p0,int p1)
  65. {
  66. if(dy[p0][p1])return dy[p0][p1];
  67. int cr=++tot; dy[p0][p1]=cr; dp[cr].Inc();
  68. for(int i=,x,y;i<;i++)
  69. if((x=c[p0][i])<=n&&(y=d[p1][i])<=m)
  70. {
  71. int v=dfs(x,y); dp[cr].Inc(dp[v]);
  72. }
  73. return cr;
  74. }
  75. void solve()
  76. { int v=dfs(,); dp[v].print();}
  77. }
  78. int main()
  79. {
  80. scanf("%d%d",&n,&m);
  81. scanf("%s",a+); scanf("%s",b+);
  82. for(int i=;i<;i++)lst[i]=n+;
  83. for(int i=n;i>=;i--)
  84. {
  85. for(int j=;j<;j++)
  86. c[i][j]=lst[j];
  87. lst[Id(a[i])]=i;
  88. }
  89. for(int i=;i<;i++)lst[i]=m+;
  90. for(int i=m;i>=;i--)
  91. {
  92. for(int j=;j<;j++)
  93. d[i][j]=lst[j];
  94. lst[Id(b[i])]=i;
  95. }
  96. int op;scanf("%d",&op);
  97. if(op==)S1::solve();
  98. else S2::solve();
  99. return ;
  100. }

LOJ 2172 「FJOI2016」所有公共子序列问题——序列自动机的更多相关文章

  1. 【LOJ】#2172. 「FJOI2016」所有公共子序列问题

    题解 听说是什么序列自动机? 我们考虑对于每个位置的串,下面拼接相同的字符时,拼接最近的一个,这样可以保证不重不漏 为了实现这个我们需要什么呢,我们需要一个链表,记录一下每个位置的下一个字符会转移到哪 ...

  2. @loj - 2174@ 「FJOI2016」神秘数

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...

  3. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  4. LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)

    题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...

  5. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  6. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  7. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  8. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  9. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

随机推荐

  1. GreenPlum 大数据平台--远程访问-->gpadmin客户端

    一,客户端连接 01,配置文件说明 在master节点的$MASTER_DATA_DIRECTORY(这个是配置的环境变量:/greenplum/data/master/gpseg-1)/pg_hba ...

  2. jquery:字符串(string)转json

    第一种方式: 使用js函数eval(); testJson=eval(testJson);是错误的转换方式. 正确的转换方式需要加(): testJson = eval("(" + ...

  3. Android应用程序组件之间的通信Intent和IntentFilter

    Android应用程序的基本组件,这些基本组建除了Content Provider之外,几乎全部都是依靠Intent对象来激活和通信的. 下面介绍Intent类,并通过例子来说明Intent一般用法 ...

  4. Oracle关于All和Any

    简单的说 All等价于N个And语句,Any等价于N个or语句.

  5. QQ音乐:React v16 新特性实践

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由QQ音乐技术团队发表于云+社区专栏 自从去年9月份 React 团队发布了 v16.0 版本开始,到18年3月刚发布的 v16.3 版 ...

  6. 【VirtualBox】快照

    一.快照备份 虚拟机系统快照下来,以后就可以恢复到快照之前的系统 右上角->虚拟电脑工具->快照

  7. c#.net常见字符串处理方法

    1.字符串比较 字符串.ComparTo(目标字符串) "a".ComparTo("b"); 2.查找子串 字符串.IndexOf(子串,查找其实位置) ; 字 ...

  8. 融云会话界面导航上移-使用IQKeyboardManager

    关于IQKeyBoardManager挤出导航栏的解决方案 方法一: 写在前面 虽然修改后能解决导航栏被挤出去的问题,但是就目前来看是有副作用的,写这篇文章就是想大家来一起讨论,毕竟键盘处理还是比较头 ...

  9. 一般处理程序、ASP.NET和MVC的区别

    这个问题说起来,我有点惭愧 想当初在大学里学的就是ASP.NET WebForms 在实习期间也是用的WebForms来开发网站,然后就觉得.NET开发网站就是用这个开发模式 现在想想都想笑...实在 ...

  10. Django的MTV模式详解

    参考博客:https://www.cnblogs.com/yuanchenqi/articles/7629939.html 一.MVC模型 Web服务器开发领域里著名的MVC模式. 所谓MVC就是把W ...