题意:给你两个串A,B,以及一个整数K,让你找到B的一个尽可能长的前缀,使得其在A串中出现的次数不小于K次。

对A串建立后缀自动机,然后把B串放在上面跑,由于每到一个结点,该结点endpos集合的大小就是该前缀出现的次数,又由于较长前缀的出现次数不大于较短前缀,所以只要跑到不满足条件停下即可。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. #define MAXL 100000
  6. #define MAXC 300
  7. int v[2*MAXL+10],__next[2*MAXL+10],first[2*MAXL+10],e;
  8. void AddEdge(int U,int V){
  9. v[++e]=V;
  10. __next[e]=first[U];
  11. first[U]=e;
  12. }
  13. char s[MAXL+10];
  14. int len;
  15. struct SAM{
  16. int endcnt[2*MAXL+10];
  17. int n,maxlen[2*MAXL+10],minlen[2*MAXL+10],trans[2*MAXL+10][MAXC],slink[2*MAXL+10];
  18. void clear(){
  19. for(int i=0;i<=n;++i){
  20. endcnt[i]=maxlen[i]=minlen[i]=slink[i]=first[i]=0;
  21. memset(trans[i],0,sizeof(trans[i]));
  22. }
  23. n=e=0;
  24. }
  25. int new_state(int _maxlen,int _minlen,int _trans[],int _slink){
  26. maxlen[n]=_maxlen;
  27. minlen[n]=_minlen;
  28. for(int i=0;i<MAXC;++i){
  29. if(_trans==NULL){
  30. trans[n][i]=-1;
  31. }
  32. else{
  33. trans[n][i]=_trans[i];
  34. }
  35. }
  36. slink[n]=_slink;
  37. return n++;
  38. }
  39. int add_char(char ch,int u){
  40. if(u==-1){
  41. return new_state(0,0,NULL,-1);
  42. }
  43. int c=ch;
  44. int z=new_state(maxlen[u]+1,-1,NULL,-1);
  45. endcnt[z]=1;
  46. int v=u;
  47. while(v!=-1 && trans[v][c]==-1){
  48. trans[v][c]=z;
  49. v=slink[v];
  50. }
  51. if(v==-1){
  52. minlen[z]=1;
  53. slink[z]=0;
  54. return z;
  55. }
  56. int x=trans[v][c];
  57. if(maxlen[v]+1==maxlen[x]){
  58. minlen[z]=maxlen[x]+1;
  59. slink[z]=x;
  60. return z;
  61. }
  62. int y=new_state(maxlen[v]+1,-1,trans[x],slink[x]);
  63. slink[y]=slink[x];
  64. minlen[x]=maxlen[y]+1;
  65. slink[x]=y;
  66. minlen[z]=maxlen[y]+1;
  67. slink[z]=y;
  68. int w=v;
  69. while(w!=-1 && trans[w][c]==x){
  70. trans[w][c]=y;
  71. w=slink[w];
  72. }
  73. minlen[y]=maxlen[slink[y]]+1;
  74. return z;
  75. }
  76. void dfs(int U){
  77. for(int i=first[U];i;i=__next[i]){
  78. dfs(v[i]);
  79. endcnt[U]+=endcnt[v[i]];
  80. }
  81. }
  82. void work_slink_tree(){
  83. for(int i=1;i<n;++i){
  84. AddEdge(slink[i],i);
  85. }
  86. dfs(0);
  87. }
  88. }sam;
  89. typedef long long ll;
  90. char s2[MAXL+10];
  91. int len2,K;
  92. int main(){
  93. gets(s);
  94. len=strlen(s);
  95. int U=sam.add_char(0,-1);
  96. for(int i=0;i<len;++i){
  97. U=sam.add_char(s[i],U);
  98. }
  99. sam.work_slink_tree();
  100. gets(s2);
  101. len2=strlen(s2);
  102. scanf("%d",&K);
  103. int ans=0;
  104. U=0;
  105. for(int i=0;i<len2;++i){
  106. if(sam.endcnt[U]<K){
  107. ans=i-1;
  108. goto OUT;
  109. }
  110. else if(sam.trans[U][s2[i]]==-1){
  111. ans=i;
  112. goto OUT;
  113. }
  114. U=sam.trans[U][s2[i]];
  115. }
  116. ans=len2;
  117. if(sam.endcnt[U]<K){
  118. ans=len2-1;
  119. goto OUT;
  120. }
  121. OUT:
  122. if(ans==0){
  123. puts("IMPOSSIBLE");
  124. }
  125. else{
  126. for(int i=0;i<ans;++i){
  127. putchar(s2[i]);
  128. }
  129. puts("");
  130. }
  131. return 0;
  132. }

【贪心】【后缀自动机】Gym - 101466E - Text Editor的更多相关文章

  1. BZOJ3998 TJOI2015 弦论 【后缀自动机】【贪心】

    Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...

  2. 【贪心】【后缀自动机】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem E. Enter the Word

    题意:给你一个串,让你从左到右构造这个串,一次操作可以直接在当前串后面添加一个任意字符,或者拷贝当前串的任意一个子串到当前串的后面.问你最少要多少次操作才能构造出这个串. 从前向后贪心,从当前已构造的 ...

  3. BZOJ_2099_[Usaco2010 Dec]Letter 恐吓信_后缀自动机+贪心

    BZOJ_2099_[Usaco2010 Dec]Letter 恐吓信_后缀自动机 Description FJ刚刚和邻居发生了一场可怕的争吵,他咽不下这口气,决定佚名发给他的邻居 一封脏话连篇的信. ...

  4. BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心

    题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...

  5. 一文读懂后缀自动机 Suffix_Automata

    原论文(俄文)地址:suffix_automata 原翻译(中文)地址:后缀自动机详解(DZYO的博客) Upd:强推浅显易懂(?)的SAM讲解 后缀自动机 后缀自动机(单词的有向无环图)--是一种强 ...

  6. 后缀自动机(SAM)+广义后缀自动机(GSA)

    经过一顿操作之后竟然疑似没退役0 0 你是XCPC选手吗?我觉得我是! 稍微补一点之前丢给队友的知识吧,除了数论以外都可以看看,为Dhaka和新队伍做点准备... 不错的零基础教程见 IO WIKI ...

  7. poj2774 Long Long Message(后缀数组or后缀自动机)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Long Long Message Time Limit: 4000MS   Me ...

  8. [模板] 后缀自动机&&后缀树

    后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 ...

  9. APIO 2014 回文串(Manacher+后缀自动机+倍增)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=3676 思路 好像还是回文自动机裸体,但是 \(\text{Manacher}\) +后缀自动 ...

随机推荐

  1. linux下使用indent整理代码(代码格式化)【转】

    转自:https://blog.csdn.net/jiangjingui2011/article/details/7197069 常用的设置: indent -npro -kr -i8 -ts8 -s ...

  2. 13-6_mysql索引_1_Mysql_Learning_Notes_20180719_13-6

    mysql索引_1_Mysql_Learning_Notes 二分查找/折半查找法,binary search 一种在有序数组中查找某一特定元素的搜索算法; 二分查找法的优点是比较少次数,查找速度快, ...

  3. 使用Scrapy命令行工具【导出JSON文件】时编码设置

    Windows 10家庭中文版,Python 3.6.4,virtualenv 16.0.0,Scrapy 1.5.0, 使用scrapy命令行工具建立了爬虫项目(startproject),并使用s ...

  4. 数据库-mysql中文显示问题

    一:在mysql 下面查看带中文的记录显示乱码 mysql> select * from role; +----+------+ | id | name | +----+------+ | 1 ...

  5. JsRender 前端渲染模板常用API学习

    JsRender 常用API 1. $.templates() $.templates()方法是用来注册或编译模板的,使用的情况有以下几种. 把html字符串编译编译成模板 获取使用script标签声 ...

  6. 关闭linux退格键和vi发出的嘟嘟声

    以root用户登录,然后请安下面方法进行操作: 在命令行下执行:echo "rmmod pcspkr" >> /etc/rc.d/rc.local

  7. 首次加载进来DEV控件列表第一行颜色总是不对,后台代码显示的数据正确

    1:行改变的颜色正确的颜色: 1.1颜色效果如下图: 1.2:设置行改变颜色: 2:结果首次加载第一行颜色为: 3:解决方案: 3.1 :Views-->OptionsSelection --& ...

  8. django 建立一个简单的应用

    本人的用的版本是python 2.7.3和django 1.10.5,Windows10系统 1.首先通过命令建立项目和app 找到django的安装路径,我的路径是:C:\Python27\Lib\ ...

  9. 浅谈malloc/free和new/delete 的区别

    malloc和new的区别 malloc是库函数,需要包头文件才能成功运行编译:new是操作符(C++中的关键字),需要在C++的环境下使用. malloc既可以在C语言中使用也可以在C++中使用,n ...

  10. 关于jedis2.4以上版本的连接池配置,及工具类

    jedis.propertise 注意以前版本的maxAcitve和maxWait有所改变,JVM根据系统环境变量ServerType中的值 取不同的配置,实现多环境(测试环境.生产环境)集成. re ...