【HDOJ】2459 Maximum repetition substring
后缀数组+RMQ。
- /* 2459 */
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <map>
- #include <queue>
- #include <set>
- #include <stack>
- #include <vector>
- #include <deque>
- #include <algorithm>
- #include <cstdio>
- #include <cmath>
- #include <ctime>
- #include <cstring>
- #include <climits>
- #include <cctype>
- #include <cassert>
- #include <functional>
- #include <iterator>
- #include <iomanip>
- using namespace std;
- //#pragma comment(linker,"/STACK:102400000,1024000")
- #define sti set<int>
- #define stpii set<pair<int, int> >
- #define mpii map<int,int>
- #define vi vector<int>
- #define pii pair<int,int>
- #define vpii vector<pair<int,int> >
- #define rep(i, a, n) for (int i=a;i<n;++i)
- #define per(i, a, n) for (int i=n-1;i>=a;--i)
- #define clr clear
- #define pb push_back
- #define mp make_pair
- #define fir first
- #define sec second
- #define all(x) (x).begin(),(x).end()
- #define SZ(x) ((int)(x).size())
- #define lson l, mid, rt<<1
- #define rson mid+1, r, rt<<1|1
- const int INF = 0x3f3f3f3f;
- const int maxn = 1e5+;
- char s[maxn];
- int a[maxn];
- int rrank[maxn], height[maxn], sa[maxn];
- int wa[maxn], wb[maxn], wc[maxn], wv[maxn];
- int dp[maxn][];
- int mx[maxn], L[maxn];
- bool cmp(int *r, int a, int b, int l) {
- return r[a]==r[b] && r[a+l]==r[b+l];
- }
- void da(int *r, int *sa, int n, int m) {
- int i, j, *x=wa, *y=wb, *t, p;
- for (i=; i<m; ++i) wc[i] = ;
- for (i=; i<n; ++i) wc[x[i]=r[i]]++;
- for (i=; i<m; ++i) wc[i] += wc[i-];
- for (i=n-; i>=; --i) sa[--wc[x[i]]] = i;
- for (j=,p=; p<n; j*=, m=p) {
- for (p=,i=n-j; i<n; ++i) y[p++] = i;
- for (i=; i<n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
- for (i=; i<n; ++i) wv[i] = x[y[i]];
- for (i=; i<m; ++i) wc[i] = ;
- for (i=; i<n; ++i) wc[x[i]]++;
- for (i=; i<m; ++i) wc[i] += wc[i-];
- for (i=n-; i>=; --i) sa[--wc[wv[i]]] = y[i];
- for (t=x, x=y, y=t, p=, i=, x[sa[]]=; i<n; ++i)
- x[sa[i]] = cmp(y, sa[i-], sa[i], j) ? p- : p++;
- }
- }
- void calheight(int *r, int *sa, int n) {
- int i, j, k = ;
- for (i=; i<=n; ++i) rrank[sa[i]] = i;
- for (i=; i<n; height[rrank[i++]]=k)
- for (k?k--:, j=sa[rrank[i]-]; r[j+k]==r[i+k]; ++k) ;
- }
- void init_RMQ(int n) {
- int i, j;
- for (i=; i<=n; ++i)
- dp[i][] = height[i];
- dp[][] = INF;
- for (j=; (<<j)<=n; ++j)
- for (i=; i+(<<j)-<=n; ++i)
- dp[i][j] = min(dp[i][j-], dp[i+(<<(j-))][j-]);
- }
- int RMQ(int l, int r) {
- if (l > r)
- swap(l, r);
- int k = ;
- ++l;
- while (<<(k+) <= r-l+)
- ++k;
- return min(dp[l][k], dp[r-(<<k)+][k]);
- }
- void printSa(int n) {
- for (int i=; i<=n; ++i)
- printf("%d ", sa[i]);
- putchar('\n');
- }
- void printHeight(int n) {
- for (int i=; i<=n; ++i)
- printf("%d ", height[i]);
- putchar('\n');
- }
- void solve() {
- int n;
- for (int i=; ; ++i) {
- if (s[i] == '\0') {
- n = i;
- break;
- }
- a[i] = s[i] - 'a' + ;
- }
- a[n] = ;
- da(a, sa, n+, );
- calheight(a, sa, n);
- init_RMQ(n);
- int n_ = n >> , tmp;
- rep(i, , n_) {
- mx[i] = ;
- for (int p=, q=i; q<n; p=q, q+=i) {
- tmp = RMQ(rrank[p], rrank[q]);
- mx[i] = max(mx[i], tmp/i+);
- if (tmp%i) {
- tmp = RMQ(rrank[p-(i-tmp%i)], rrank[q-(i-tmp%i)]);
- mx[i] = max(mx[i], tmp/i+);
- }
- }
- }
- int ans = ;
- rep(i, , n_)
- ans = max(ans, mx[i]);
- int ln = ;
- rep(i, , n_) {
- if (mx[i] == ans) {
- L[ln++] = i;
- }
- }
- int beg = , len = ;
- rep(i, , n+) {
- rep(j, , ln) {
- int p = sa[i];
- if (p+L[j] >= n)
- continue;
- tmp = RMQ(rrank[p], rrank[p+L[j]]);
- if (tmp/L[j]+ >= ans) {
- beg = p;
- len = L[j] * ans;
- goto _output;
- }
- }
- }
- _output:
- s[beg+len] = '\0';
- puts(s+beg);
- }
- int main() {
- ios::sync_with_stdio(false);
- #ifndef ONLINE_JUDGE
- freopen("data.in", "r", stdin);
- freopen("data.out", "w", stdout);
- #endif
- int t = ;
- while (scanf("%s", s)!=EOF && (s[]!='#')) {
- printf("Case %d: ", ++t);
- solve();
- }
- #ifndef ONLINE_JUDGE
- printf("time = %d.\n", (int)clock());
- #endif
- return ;
- }
数据生成器。
- from random import randint, shuffle
- import shutil
- import string
- def GenDataIn():
- with open("data.in", "w") as fout:
- t = 20
- bound = 10**2
- lc = list(string.lowercase)
- for tt in xrange(t):
- length = randint(100, 500)
- line = ""
- for i in xrange(length):
- idx = randint(0, 25)
- line += lc[idx]
- fout.write("%s\n" % line)
- fout.write("#\n")
- def MovDataIn():
- desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
- shutil.copyfile("data.in", desFileName)
- if __name__ == "__main__":
- GenDataIn()
- MovDataIn()
【HDOJ】2459 Maximum repetition substring的更多相关文章
- HDU 2459 Maximum repetition substring
题目:Maximum repetition substring 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2459 题意:给你一个字符串,求连续重复出现 ...
- 【后缀数组】poj3693 Maximum repetition substring
sa在清空方面存在一些奇怪的问题……难以ac.(留坑?)
- 【HDOJ】1403 Longest Common Substring
后缀数组2倍增可解. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXM 28 ...
- 【LeetCode】718. Maximum Length of Repeated Subarray 解题报告(Python)
[LeetCode]718. Maximum Length of Repeated Subarray 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxu ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- Maximum repetition substring 后缀数组
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7578 Acc ...
- Maximum repetition substring (poj3693 后缀数组求重复次数最多的连续重复子串)
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6328 Acc ...
- 【SP1812】LCS2 - Longest Common Substring II
[SP1812]LCS2 - Longest Common Substring II 题面 洛谷 题解 你首先得会做这题. 然后就其实就很简单了, 你在每一个状态\(i\)打一个标记\(f[i]\)表 ...
- 【SP1811】LCS - Longest Common Substring
[SP1811]LCS - Longest Common Substring 题面 洛谷 题解 建好后缀自动机后从初始状态沿着现在的边匹配, 如果失配则跳它的后缀链接,因为你跳后缀链接到达的\(End ...
随机推荐
- prototype原型理解
一切都是对象,对象是若干属性的集合 数组是对象.函数是对象.对象还是对象.对象里面的一切都是属性,只有属性,没有方法.方法也是属性. 一切引用类型都是属性 怎么判断一个值是否是对象? 值类型的类型 ...
- 在Linux上部署和操作Couchbase
couchbase属于nosql系列,个人感觉它要比mongodb操作简单,mongo的查询语句太复杂.在数据的持久性方面它区别于其他nosql 的唯一大亮点是不受限于其内存分配了多少,只要磁盘空间够 ...
- 用JS写的简单轮播特效
效果如下 功能分析 1.每隔1秒换一张图片 2.鼠标移入停止切换.鼠标离开继续切换 3.鼠标移入到数字上面的时候,显示和数字对应的图片,并且停止切换,被选中的数字,背景显示橙色 4.鼠标离开数字,从该 ...
- JavaScript 高级程序设计 01-基本概念
一.JavaScript组成 1.一个完成JavaScript是由ECMAScript.DOM.BOM三部分组成的. ECMAScript:提供核心语言功能--语法.类型.语句.关键字.保留字.操作符 ...
- CentOS-6.5安装配置JDK-7|Tomcat-8
安装说明 系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7-linux-x64.rpm 下载地址:http://www.oracle.com/technetwork/java/j ...
- C++ 容器及选用总结
目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭代器 第五 ...
- C#网络编程简单实现通信小例子-2
1.主界面 2.源代码 Client public partial class For ...
- Redhat 显示系统版本号和内核版本号
1./etc/issue 和 /etc/redhat-release都是系统安装时默认的发行版本信息,通常安装好系统后文件内容不会发生变化.[root@rac1 mysql]# cat /etc/is ...
- 【BZOJ2428】[HAOI2006]均分数据
Description 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第 ...
- 1197: [HNOI2006]花仙子的魔法 - BZOJ
Description Input 包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n.其中,1≤m≤100,1≤n≤15. Output 仅包含一个整数,表示 ...