后缀数组+RMQ。

  1. /* 2459 */
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <map>
  6. #include <queue>
  7. #include <set>
  8. #include <stack>
  9. #include <vector>
  10. #include <deque>
  11. #include <algorithm>
  12. #include <cstdio>
  13. #include <cmath>
  14. #include <ctime>
  15. #include <cstring>
  16. #include <climits>
  17. #include <cctype>
  18. #include <cassert>
  19. #include <functional>
  20. #include <iterator>
  21. #include <iomanip>
  22. using namespace std;
  23. //#pragma comment(linker,"/STACK:102400000,1024000")
  24.  
  25. #define sti set<int>
  26. #define stpii set<pair<int, int> >
  27. #define mpii map<int,int>
  28. #define vi vector<int>
  29. #define pii pair<int,int>
  30. #define vpii vector<pair<int,int> >
  31. #define rep(i, a, n) for (int i=a;i<n;++i)
  32. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  33. #define clr clear
  34. #define pb push_back
  35. #define mp make_pair
  36. #define fir first
  37. #define sec second
  38. #define all(x) (x).begin(),(x).end()
  39. #define SZ(x) ((int)(x).size())
  40. #define lson l, mid, rt<<1
  41. #define rson mid+1, r, rt<<1|1
  42.  
  43. const int INF = 0x3f3f3f3f;
  44. const int maxn = 1e5+;
  45. char s[maxn];
  46. int a[maxn];
  47. int rrank[maxn], height[maxn], sa[maxn];
  48. int wa[maxn], wb[maxn], wc[maxn], wv[maxn];
  49. int dp[maxn][];
  50. int mx[maxn], L[maxn];
  51.  
  52. bool cmp(int *r, int a, int b, int l) {
  53. return r[a]==r[b] && r[a+l]==r[b+l];
  54. }
  55.  
  56. void da(int *r, int *sa, int n, int m) {
  57. int i, j, *x=wa, *y=wb, *t, p;
  58.  
  59. for (i=; i<m; ++i) wc[i] = ;
  60. for (i=; i<n; ++i) wc[x[i]=r[i]]++;
  61. for (i=; i<m; ++i) wc[i] += wc[i-];
  62. for (i=n-; i>=; --i) sa[--wc[x[i]]] = i;
  63. for (j=,p=; p<n; j*=, m=p) {
  64. for (p=,i=n-j; i<n; ++i) y[p++] = i;
  65. for (i=; i<n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
  66. for (i=; i<n; ++i) wv[i] = x[y[i]];
  67. for (i=; i<m; ++i) wc[i] = ;
  68. for (i=; i<n; ++i) wc[x[i]]++;
  69. for (i=; i<m; ++i) wc[i] += wc[i-];
  70. for (i=n-; i>=; --i) sa[--wc[wv[i]]] = y[i];
  71. for (t=x, x=y, y=t, p=, i=, x[sa[]]=; i<n; ++i)
  72. x[sa[i]] = cmp(y, sa[i-], sa[i], j) ? p- : p++;
  73. }
  74. }
  75.  
  76. void calheight(int *r, int *sa, int n) {
  77. int i, j, k = ;
  78.  
  79. for (i=; i<=n; ++i) rrank[sa[i]] = i;
  80. for (i=; i<n; height[rrank[i++]]=k)
  81. for (k?k--:, j=sa[rrank[i]-]; r[j+k]==r[i+k]; ++k) ;
  82. }
  83.  
  84. void init_RMQ(int n) {
  85. int i, j;
  86.  
  87. for (i=; i<=n; ++i)
  88. dp[i][] = height[i];
  89. dp[][] = INF;
  90. for (j=; (<<j)<=n; ++j)
  91. for (i=; i+(<<j)-<=n; ++i)
  92. dp[i][j] = min(dp[i][j-], dp[i+(<<(j-))][j-]);
  93. }
  94.  
  95. int RMQ(int l, int r) {
  96. if (l > r)
  97. swap(l, r);
  98.  
  99. int k = ;
  100. ++l;
  101. while (<<(k+) <= r-l+)
  102. ++k;
  103.  
  104. return min(dp[l][k], dp[r-(<<k)+][k]);
  105. }
  106.  
  107. void printSa(int n) {
  108. for (int i=; i<=n; ++i)
  109. printf("%d ", sa[i]);
  110. putchar('\n');
  111. }
  112.  
  113. void printHeight(int n) {
  114. for (int i=; i<=n; ++i)
  115. printf("%d ", height[i]);
  116. putchar('\n');
  117. }
  118.  
  119. void solve() {
  120. int n;
  121.  
  122. for (int i=; ; ++i) {
  123. if (s[i] == '\0') {
  124. n = i;
  125. break;
  126. }
  127. a[i] = s[i] - 'a' + ;
  128. }
  129. a[n] = ;
  130.  
  131. da(a, sa, n+, );
  132. calheight(a, sa, n);
  133. init_RMQ(n);
  134.  
  135. int n_ = n >> , tmp;
  136. rep(i, , n_) {
  137. mx[i] = ;
  138. for (int p=, q=i; q<n; p=q, q+=i) {
  139. tmp = RMQ(rrank[p], rrank[q]);
  140. mx[i] = max(mx[i], tmp/i+);
  141. if (tmp%i) {
  142. tmp = RMQ(rrank[p-(i-tmp%i)], rrank[q-(i-tmp%i)]);
  143. mx[i] = max(mx[i], tmp/i+);
  144. }
  145. }
  146. }
  147.  
  148. int ans = ;
  149. rep(i, , n_)
  150. ans = max(ans, mx[i]);
  151.  
  152. int ln = ;
  153. rep(i, , n_) {
  154. if (mx[i] == ans) {
  155. L[ln++] = i;
  156. }
  157. }
  158.  
  159. int beg = , len = ;
  160.  
  161. rep(i, , n+) {
  162. rep(j, , ln) {
  163. int p = sa[i];
  164. if (p+L[j] >= n)
  165. continue;
  166.  
  167. tmp = RMQ(rrank[p], rrank[p+L[j]]);
  168. if (tmp/L[j]+ >= ans) {
  169. beg = p;
  170. len = L[j] * ans;
  171. goto _output;
  172. }
  173. }
  174. }
  175.  
  176. _output:
  177. s[beg+len] = '\0';
  178. puts(s+beg);
  179. }
  180.  
  181. int main() {
  182. ios::sync_with_stdio(false);
  183. #ifndef ONLINE_JUDGE
  184. freopen("data.in", "r", stdin);
  185. freopen("data.out", "w", stdout);
  186. #endif
  187.  
  188. int t = ;
  189.  
  190. while (scanf("%s", s)!=EOF && (s[]!='#')) {
  191. printf("Case %d: ", ++t);
  192. solve();
  193. }
  194.  
  195. #ifndef ONLINE_JUDGE
  196. printf("time = %d.\n", (int)clock());
  197. #endif
  198.  
  199. return ;
  200. }

数据生成器。

  1. from random import randint, shuffle
  2. import shutil
  3. import string
  4.  
  5. def GenDataIn():
  6. with open("data.in", "w") as fout:
  7. t = 20
  8. bound = 10**2
  9. lc = list(string.lowercase)
  10. for tt in xrange(t):
  11. length = randint(100, 500)
  12. line = ""
  13. for i in xrange(length):
  14. idx = randint(0, 25)
  15. line += lc[idx]
  16. fout.write("%s\n" % line)
  17. fout.write("#\n")
  18.  
  19. def MovDataIn():
  20. desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
  21. shutil.copyfile("data.in", desFileName)
  22.  
  23. if __name__ == "__main__":
  24. GenDataIn()
  25. MovDataIn()

【HDOJ】2459 Maximum repetition substring的更多相关文章

  1. HDU 2459 Maximum repetition substring

    题目:Maximum repetition substring 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2459 题意:给你一个字符串,求连续重复出现 ...

  2. 【后缀数组】poj3693 Maximum repetition substring

    sa在清空方面存在一些奇怪的问题……难以ac.(留坑?)

  3. 【HDOJ】1403 Longest Common Substring

    后缀数组2倍增可解. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXM 28 ...

  4. 【LeetCode】718. Maximum Length of Repeated Subarray 解题报告(Python)

    [LeetCode]718. Maximum Length of Repeated Subarray 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxu ...

  5. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  6. Maximum repetition substring 后缀数组

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7578   Acc ...

  7. Maximum repetition substring (poj3693 后缀数组求重复次数最多的连续重复子串)

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6328   Acc ...

  8. 【SP1812】LCS2 - Longest Common Substring II

    [SP1812]LCS2 - Longest Common Substring II 题面 洛谷 题解 你首先得会做这题. 然后就其实就很简单了, 你在每一个状态\(i\)打一个标记\(f[i]\)表 ...

  9. 【SP1811】LCS - Longest Common Substring

    [SP1811]LCS - Longest Common Substring 题面 洛谷 题解 建好后缀自动机后从初始状态沿着现在的边匹配, 如果失配则跳它的后缀链接,因为你跳后缀链接到达的\(End ...

随机推荐

  1. prototype原型理解

    一切都是对象,对象是若干属性的集合   数组是对象.函数是对象.对象还是对象.对象里面的一切都是属性,只有属性,没有方法.方法也是属性. 一切引用类型都是属性 怎么判断一个值是否是对象? 值类型的类型 ...

  2. 在Linux上部署和操作Couchbase

    couchbase属于nosql系列,个人感觉它要比mongodb操作简单,mongo的查询语句太复杂.在数据的持久性方面它区别于其他nosql 的唯一大亮点是不受限于其内存分配了多少,只要磁盘空间够 ...

  3. 用JS写的简单轮播特效

    效果如下 功能分析 1.每隔1秒换一张图片 2.鼠标移入停止切换.鼠标离开继续切换 3.鼠标移入到数字上面的时候,显示和数字对应的图片,并且停止切换,被选中的数字,背景显示橙色 4.鼠标离开数字,从该 ...

  4. JavaScript 高级程序设计 01-基本概念

    一.JavaScript组成 1.一个完成JavaScript是由ECMAScript.DOM.BOM三部分组成的. ECMAScript:提供核心语言功能--语法.类型.语句.关键字.保留字.操作符 ...

  5. CentOS-6.5安装配置JDK-7|Tomcat-8

    安装说明 系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7-linux-x64.rpm 下载地址:http://www.oracle.com/technetwork/java/j ...

  6. C++ 容器及选用总结

    目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭代器 第五 ...

  7. C#网络编程简单实现通信小例子-2

    1.主界面  2.源代码                                                         Client public partial class For ...

  8. Redhat 显示系统版本号和内核版本号

    1./etc/issue 和 /etc/redhat-release都是系统安装时默认的发行版本信息,通常安装好系统后文件内容不会发生变化.[root@rac1 mysql]# cat /etc/is ...

  9. 【BZOJ2428】[HAOI2006]均分数据

    Description 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第 ...

  10. 1197: [HNOI2006]花仙子的魔法 - BZOJ

    Description Input 包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n.其中,1≤m≤100,1≤n≤15. Output 仅包含一个整数,表示 ...