[SPOJ 687]Repeats
Description
给出一个长度为 \(n\) 的字符串,求重复次数最多的连续重复子串。
\(1\leq n\leq 50000\)
Solution

Code
#include <bits/stdc++.h>
#define log2 LOG
using namespace std;
const int N = 100000+5, inf = ~0u>>1;
char ch[N];
int n, m, x[N<<1], y[N<<1], c[N], sa[N], rk[N], height[N], Case;
int log2[N], bin[30], f[30][N], ans, t;
void get() {
    for (int i = 1; i <= m; i++) c[i] = 0;
    for (int i = 1; i <= n; i++) c[x[i] = ch[i]]++;
    for (int i = 2; i <= m; i++) c[i] += c[i-1];
    for (int i = n; i >= 1; i--) sa[c[x[i]]--] = i;
    for (int k = 1; k <= n; k <<= 1) {
        int num = 0;
        for (int i = n-k+1; i <= n; i++) y[++num] = i;
        for (int i = 1; i <= n; i++) if (sa[i] > k) y[++num] = sa[i]-k;
        for (int i = 1; i <= m; i++) c[i] = 0;
        for (int i = 1; i <= n; i++) c[x[i]]++;
        for (int i = 2; i <= m; i++) c[i] += c[i-1];
        for (int i = n; i >= 1; i--) sa[c[x[y[i]]]--] = y[i];
        swap(x, y); x[sa[1]] = num = 1;
        for (int i = 2; i <= n; i++)
            x[sa[i]] = (y[sa[i]] == y[sa[i-1]] && y[sa[i]+k] == y[sa[i-1]+k]) ? num : ++num;
        if ((m = num) == n) break;
    }
    for (int i = 1; i <= n; i++) rk[sa[i]] = i;
    for (int i = 1, k = 0; i <= n; i++) {
        if (rk[i] == 1) continue;
        if (k) --k; int j = sa[rk[i]-1];
        while (j+k <= n && i+k <= n && ch[i+k] == ch[j+k]) ++k;
        height[rk[i]] = k;
    }
}
void rmq() {
    int t = log2[n];
    for (int i = 1; i <= n; i++) f[0][i] = height[i];
    for (int i = 1; i <= t; i++)
        for (int j = 1; j+bin[i]-1 <= n; j++)
            f[i][j] = min(f[i-1][j], f[i-1][j+bin[i-1]]);
}
int query(int a, int b) {
    a = rk[a], b = rk[b];
    if (a > b) swap(a, b); ++a;
    int t = log2[b-a+1];
    return min(f[t][a], f[t][b-bin[t]+1]);
}
void work() {
    bin[0] = 1; log2[0] = -1;
    for (int i = 1; i <= 25; i++) bin[i] = (bin[i-1]<<1);
    for (int i = 1; i < N; i++) log2[i] = log2[i>>1]+1;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n); getchar(); m = 255; ans = 0;
        for (int i = 1; i <= n; i++) scanf("%c", &ch[i]), getchar();
        get(); rmq();
        for (int l = 1; l <= n; l++)
            for (int i = 1; i+l <= n; i += l) {
                int k = query(i, i+l), t = l-k%l, p = i-t, m = k/l+1;
                if (p > 0 && query(p+l, p) >= l-k%l) ++m;
                if (m > ans) ans = m;
            }
        printf("%d\n", ans);
    }
}
int main() {work(); return 0; }												
											[SPOJ 687]Repeats的更多相关文章
- SPOJ 687 Repeats(后缀数组+ST表)
		
[题目链接] http://www.spoj.com/problems/REPEATS/en/ [题目大意] 求重复次数最多的连续重复子串的长度. [题解] 考虑错位匹配,设重复部分长度为l,记s[i ...
 - SPOJ 687 REPEATS - Repeats
		
题意 给定字符串,求重复次数最多的连续重复子串 思路 后缀数组的神题 让我对着题解想了快1天 首先考虑一个暴力,枚举循环串的长度l,然后再枚举每个点i,用i和i+l匹配,如果匹配长度是L,这个循环串就 ...
 - 687. Repeats     spoj   (后缀数组   重复次数最多的连续重复子串)
		
687. Repeats Problem code: REPEATS A string s is called an (k,l)-repeat if s is obtained by concaten ...
 - SPOJ REPEATS Repeats (后缀数组 + RMQ:子串的最大循环节)题解
		
题意: 给定一个串\(s\),\(s\)必有一个最大循环节的连续子串\(ss\),问最大循环次数是多少 思路: 我们可以知道,如果一个长度为\(L\)的子串连续出现了两次及以上,那么必然会存在\(s[ ...
 - 后缀数组 & 题目
		
后缀数组被称为字符串处理神器,要解决字符串问题,一定要掌握它.(我这里的下标全部都是从1开始) 首先后缀数组要处理出两个数组,一个是sa[],sa[i]表示排名第i为的后缀的起始位置是什么,rank[ ...
 - hdu 2459 (后缀数组+RMQ)
		
题意:让你求一个串中连续重复次数最多的串(不重叠),如果重复的次数一样多的话就输出字典序小的那一串. 分析:有一道比这个简单一些的题spoj 687, 假设一个长度为l的子串重复出现两次,那么它必然会 ...
 - UOJ #35. 后缀排序[后缀数组详细整理]
		
#35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...
 - SPOJ REPEATS 后缀数组
		
题目链接:http://www.spoj.com/problems/REPEATS/en/ 题意:首先定义了一个字符串的重复度.即一个字符串由一个子串重复k次构成.那么最大的k即是该字符串的重复度.现 ...
 - SPOJ Repeats(后缀数组+RMQ-ST)
		
REPEATS - Repeats no tags A string s is called an (k,l)-repeat if s is obtained by concatenating k& ...
 
随机推荐
- java数据库编程(未整理完,待续)
			
java使用数据库可以借助jdbc这个中间媒介.本文将介绍如何使用jdbc连接数据库,数据库的基本操作和jdbc的事物处理. 1 连接数据库 一般java连接数据库,都有几个步骤: 0.导入相应的驱动 ...
 - secureCRT端口转发功能突破防火墙限制
			
这样一个场景:A是办公网络的一台windows主机,B是一台Linux堡垒机,C是生产环境一台Oracle主机, A只能访问B但A不能访问C,B可以访问到C,那怎样才可以使A机上的“ PLSQL De ...
 - cxgrid回车移到下一个单元格
			
cxgrid回车移到下一个单元格 cxgrid回车移到下一个单元格 作用:表格式录入全键盘操作. 设置cxgrid1Dbtableview1.optionsBehavior.goToNextCel ...
 - .net core 与ELK(3)安装Kibana
			
1.去产品官网下载https://www.elastic.co/downloads/kibana 对应的tar.gz的压缩包,放到/usr/local/src目录 2.解压 -linux-x86_64 ...
 - Stm32ADC-内部温度传感器的使用
			
搞完了ADC的基本配置步骤,下面就是ADC配合一些外设的应用了,首先就是stm32f1内部的温度传感器通过adc采集获得温度; 内部温度传感器在ADC1的通道16上,所以只需要初始化以下ADC1就好了 ...
 - Git错误日志--! [rejected]
			
当出现下面错误时 ,是因为和仓库两端版本不一致时,常见于刚创建仓库时,中只有readme文件的情况.执行下面的运行完毕之后.再push到仓库即可 ! [rejected] master -> m ...
 - 201621123018《java程序设计》第13周作业总结
			
1. 本周学习总结 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网络同时使用,需要为你的系统增加网络功能. 2.1 简述你想为你的系统增加什 ...
 - delphi datetimepicker 修改时间无效问题
			
今天用delphi写个程序,使用datetimepicker获得想要的时间.蛋疼的问题是无论怎么调整明明看着控件里面的日期变了,但是show出来的datetimepicker.datetime日期都不 ...
 - 网络编程-socket(二)
			
https://www.cnblogs.com/mys6/p/10587673.html(网络编程) 持续通话 总结 # 网络开发的架构 :C/S B/S# mac地址是什么 -身份证号# ip地址 ...
 - 【环境学习】ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞
			
环境保留:2019.4.4-4.10 环境搭建: 这里我使用的是:vulhub vulhub目录结构:vulhub/thinkphp/5-rcess 测试地址(开放一段时间供大家学习):http:// ...