题意:给定一个由小写字母组成的字符串,每次可以花费p在串后加上任意一个字母,花费q在串后复制一个当前串的子串,问生成字符串的最小花费

n<=2e5,1<=p,q<2^31

思路:

SAM上每个结点表示的串长度为[st[F[p]]+1,st[p]],如果长度不符合当前i,j的要求,比如复制的时候长度小于当前的一半或者长度大于[j+1,i]就暴力往上跳parent

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned int uint;
  5. typedef unsigned long long ull;
  6. typedef pair<int,int> PII;
  7. typedef pair<ll,ll> Pll;
  8. typedef vector<int> VI;
  9. typedef vector<PII> VII;
  10. typedef pair<ll,int>P;
  11. #define N 500010
  12. #define M 210000
  13. #define fi first
  14. #define se second
  15. #define MP make_pair
  16. #define pi acos(-1)
  17. #define mem(a,b) memset(a,b,sizeof(a))
  18. #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
  19. #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
  20. #define lowbit(x) x&(-x)
  21. #define Rand (rand()*(1<<16)+rand())
  22. #define id(x) ((x)<=B?(x):m-n/(x)+1)
  23. #define ls p<<1
  24. #define rs p<<1|1
  25.  
  26. const ll MOD=1e9+,inv2=(MOD+)/;
  27. double eps=1e-;
  28. ll INF=1ll<<;
  29. ll inf=5e13;
  30. int dx[]={-,,,};
  31. int dy[]={,,-,};
  32.  
  33. char s[N];
  34. int ch[N][],st[N],F[N],p,np,q,nq,cnt,t;
  35. ll dp[N],A,B;
  36.  
  37. int read()
  38. {
  39. int v=,f=;
  40. char c=getchar();
  41. while(c<||<c) {if(c=='-') f=-; c=getchar();}
  42. while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
  43. return v*f;
  44. }
  45.  
  46. struct sam
  47. {
  48. void extend(int x)
  49. {
  50. p=np;
  51. st[np=++cnt]=st[p]+;
  52. while(p&&!ch[p][x])
  53. {
  54. ch[p][x]=np;
  55. p=F[p];
  56. }
  57.  
  58. if(!p) F[np]=;
  59. else if(st[p]+==st[q=ch[p][x]]) F[np]=q;
  60. else
  61. {
  62. st[nq=++cnt]=st[p]+;
  63. memcpy(ch[nq],ch[q],sizeof ch[q]);
  64. F[nq]=F[q];
  65. F[q]=F[np]=nq;
  66. while(p&&ch[p][x]==q)
  67. {
  68. ch[p][x]=nq;
  69. p=F[p];
  70. }
  71. }
  72. }
  73.  
  74. void cancel(int len)
  75. {
  76. while(t&&st[F[t]]>=len) t=F[t];
  77. if(!t) t=;
  78. }
  79.  
  80. void trans(int len,int x)
  81. {
  82. t=ch[t][x];
  83. if(!t) t=;
  84. cancel(len);
  85. }
  86.  
  87. }sam;
  88.  
  89. void solve()
  90. {
  91. int n=strlen(s);
  92. //rep(i,1,n) dp[i]=INF;
  93.  
  94. cnt=np=t=;
  95. sam.extend(s[]-'a');
  96. dp[]=A;
  97. int j=;
  98. rep(i,,n-)
  99. {
  100. dp[i]=dp[i-]+A;
  101. int x=s[i]-'a';
  102. while((!ch[t][x]||i-j+>(i+)/)&&j<=i)
  103. {
  104. sam.extend(s[j++]-'a');
  105. sam.cancel(i-j);
  106.  
  107. }
  108. sam.trans(i-j+,x);
  109. if(j<=i) dp[i]=min(dp[i],dp[j-]+B);
  110. }
  111.  
  112. rep(i,,cnt)
  113. {
  114. rep(j,,) ch[i][j]=;
  115. F[i]=st[i]=;
  116. }
  117. printf("%lld\n",dp[n-]);
  118. }
  119.  
  120. int main()
  121. {
  122. //freopen("1.in","r",stdin);
  123. //freopen("1.out","w",stdout);
  124. while(scanf("%s%lld%lld",s,&A,&B)!=EOF)
  125. {
  126. solve();
  127. }
  128. return ;
  129. }

【HDOJ6583】Typewriter(SAM,DP)的更多相关文章

  1. 【BZOJ1237】配对(贪心,DP)

    题意:有n个a[i]和b[i],调整顺序使abs(a[i]-b[i])之和最小,但a[i]<>b[i].保证所有 Ai各不相同,Bi也各不相同. 30%的数据满足:n <= 104 ...

  2. 【CF981D】Bookshelves(贪心,动态规划)

    [CF981D]Bookshelves(贪心,动态规划) 题面 洛谷 Codeforces 给定一个长度为\(n\)的数列,把他们划分成\(k\)段,使得每段的和的结构按位与起来最大. 题解 从高位往 ...

  3. 【BZOJ3160】万径人踪灭(FFT,Manacher)

    [BZOJ3160]万径人踪灭(FFT,Manacher) 题面 BZOJ 题解 很容易想到就是满足条件的子序列个数减去回文子串的个数吧... 至于满足条件的子序列 我们可以依次枚举对称轴 如果知道关 ...

  4. 【BZOJ1216】操作系统(堆,模拟)

    [BZOJ1216]操作系统(堆,模拟) 题面 题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示 ...

  5. 【CF183D】T-shirt(动态规划,贪心)

    [CF183D]T-shirt(动态规划,贪心) 题面 洛谷 CodeForces 题解 \(O(n^2m)\)的暴力懒得写了,比较容易,可以自己想想. 做法是这样的,首先我们发现一个结论: 对于某个 ...

  6. 【BZOJ4945】【NOI2017】游戏(搜索,2-sat)

    [NOI2017]游戏(搜索,2-sat) 题面 BZOJ的SPJ是假的 兹磁洛谷 题解 如果没有\(x\)地图的影响 这就是一个裸的\(2-sat\)问题 但是现在有不超过\(8\)个\(x\)地图 ...

  7. 【NOIP2016】愤怒的小鸟(状压DP)

    题意: Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形如 ...

  8. 【专题】平衡树(Treap,fhq-treap)

    [旋转] 平衡树中的旋转是指在不改变中序遍历的前提下改变树的形态的方式.(中序遍历=排名顺序) 右旋将当前点的左节点旋上来,左旋反之.(图侵删) void rturn(int &k){ int ...

  9. 【CodeChef】KNGHTMOV(方案数DP)

    题意: 考虑一张无限大的方格棋盘.我们有一个“骑士”,它必须从(0,0)格开始,按照如下规则,移动至(X,Y)格:每一步,它只能从(u,v)格移动至(u+Ax,v+Ay)或者(u+Bx,v+By).注 ...

随机推荐

  1. Oralce-资源配置PROFILE

    profile:作为用户配置文件,它是密码限制,资源限制的命名集合 在安装数据库时,Oracle自动会建立名为default的默认配置文件 使用profile文件时,要注意以下几点: 建立用户时,如果 ...

  2. centos6.5下apollo1.7.1的搭建

    前言:apollo MQ作为消息队列中间件,在需要消息列表的应用程序环境中,需要使用该服务器中间件 1.准备工作 2.搭建 3.测试 1.准备工作 第一步:linux系统中配置好java环境 A.卸载 ...

  3. Java中的基本类型和包装类型区别

    首先看一下几个测试题,验证一下java中对基本类型和包装类型的理解,看看最后输出的答案对不对,答案在这篇博客中哦: // 第一题: 基本类型和包装类型 int a = 100; Integer b = ...

  4. python math 模块

    数学模块 引入模块:import math 注意: 使用某个模块下的函数,必须先引入这个模块,否则无法正常使用. ceil() 向上取整操作 格式:math.ceil(数值) 返回值:整型 floor ...

  5. JavaScript.import

    // --file.js-- function getJSON(url, callback) {   let xhr = new XMLHttpRequest();   xhr.onload = fu ...

  6. CentOS安装Prolog和Erlang语言

    安装Erlang比较简单 下载Erlang的压缩包 输入tar -zxvf 压缩包 解压 进入解压的目录下 输入./configure 在./configure执行完成后,输入make 然后输入mak ...

  7. BZOJ 1588 (treap)

    题面 传送门 分析 语文题,主要是如何理解最小波动值 设当前天的营业额为x,则最小波动值为min(x-最大的<=x的数,最小的>=x的数-x) 然后用Treap维护序列就可以了 时间复杂度 ...

  8. Javascript 数组的一些操作

    (1) shift  删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4, ...

  9. Pull Request的正确打开方式(如何在GitHub上贡献开源项目)

    Pull Request的正确打开方式(如何在GitHub上贡献开源项目) GitHub的官方帮助如下: Fork A Repo: https://help.github.com/articles/f ...

  10. owaspbwa tickets

    owaspbwa tickets 来源  https://sourceforge.net/p/owaspbwa/tickets/ 192 SQL Injection in pic_id paramet ...