UVa 10829 L-Gap Substrings (后缀数组+rmq)
题意:给定上一个串,问你多少种UVU这一种形式的串,其中U不为空并且V的长度给定了。
析:枚举 U 的长度L,那么U一定是经过 0 L 2L 3L .... 其中的一个,所以求两个长度反lcp,一个向前延伸lcp1,一个向后延伸lcp2,然后加起来,要保证每个都不超过L,否则就会重复,然后个数就是 lcp1+lcp2-L。
代码如下:
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- #include <cstdio>
- #include <string>
- #include <cstdlib>
- #include <cmath>
- #include <iostream>
- #include <cstring>
- #include <set>
- #include <queue>
- #include <algorithm>
- #include <vector>
- #include <map>
- #include <cctype>
- #include <cmath>
- #include <stack>
- #include <sstream>
- #include <list>
- #include <assert.h>
- #include <bitset>
- #define debug() puts("++++");
- #define gcd(a, b) __gcd(a, b)
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define fi first
- #define se second
- #define pb push_back
- #define sqr(x) ((x)*(x))
- #define ms(a,b) memset(a, b, sizeof a)
- #define sz size()
- #define pu push_up
- #define pd push_down
- #define cl clear()
- #define all 1,n,1
- #define FOR(i,x,n) for(int i = (x); i < (n); ++i)
- #define freopenr freopen("in.txt", "r", stdin)
- #define freopenw freopen("out.txt", "w", stdout)
- using namespace std;
- typedef long long LL;
- typedef unsigned long long ULL;
- typedef pair<int, int> P;
- const int INF = 0x3f3f3f3f;
- const double inf = 1e20;
- const double PI = acos(-1.0);
- const double eps = 1e-8;
- const int maxn = 1e5 + 10;
- const int maxm = 1e6 + 10;
- const int mod = 50007;
- const int dr[] = {-1, 0, 1, 0};
- const int dc[] = {0, -1, 0, 1};
- const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
- int n, m;
- const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- inline bool is_in(int r, int c) {
- return r >= 0 && r < n && c >= 0 && c < m;
- }
- struct Suffix_array{
- int s[maxn], sa[maxn], t[maxn], t2[maxn];
- int c[maxn], h[maxn], r[maxn];
- int n;
- int dp[maxn][20];
- void init(){ n = 0; ms(sa, 0); }
- void build_sa(int m){
- int *x = t, *y = t2;
- for(int i = 0; i < m; ++i) c[i] = 0;
- for(int i = 0; i < n; ++i) ++c[x[i] = s[i]];
- for(int i = 1; i < m; ++i) c[i] += c[i-1];
- for(int i = n-1; i >= 0; --i) sa[--c[x[i]]] = i;
- for(int k = 1; k <= n; k <<= 1){
- int p = 0;
- for(int i = n-k; i < n; ++i) y[p++] = i;
- for(int i = 0; i < n; ++i) if(sa[i] >= k) y[p++] = sa[i] - k;
- for(int i = 0; i < m; ++i) c[i] = 0;
- for(int i = 0; i < n; ++i) ++c[x[y[i]]];
- for(int i = 1; i < m; ++i) c[i] += c[i-1];
- for(int i = n-1; i >= 0; --i) sa[--c[x[y[i]]]] = y[i];
- swap(x, y);
- p = 1; x[sa[0]] = 0;
- for(int i = 1; i < n; ++i)
- x[sa[i]] = y[sa[i]] == y[sa[i-1]] && y[sa[i]+k] == y[sa[i-1]+k] ? p - 1 : p++;
- if(p >= n) break;
- m = p;
- }
- }
- void getHight(){
- int k = 0;
- for(int i = 0; i < n; ++i) r[sa[i]] = i;
- for(int i = 0; i < n; ++i){
- if(k) --k;
- int j = sa[r[i]-1];
- while(s[i+k] == s[j+k]) ++k;
- h[r[i]] = k;
- }
- }
- void rmq_init(){
- for(int i = 1; i <= n; ++i) dp[i][0] = h[i];
- for(int j = 1; (1<<j) <= n; ++j)
- for(int i = 1; i + (1<<j) <= n; ++i)
- dp[i][j] = min(dp[i][j-1], dp[i+(1<<j-1)][j-1]);
- }
- int query(int L, int R){
- L = r[L]; R = r[R];
- if(L > R) swap(L, R);
- ++L;
- int k = log(R - L + 1.0) / log(2.0);
- return min(dp[L][k], dp[R-(1<<k)+1][k]);
- }
- LL solve(int len, int g){
- LL ans = 0;
- for(int i = 1; i < len; ++i){
- for(int j = 0; j + i + g < len; j += i){
- int lcp = min(i, query(j, j+i+g)) + min(query(n-1-j, n-1-j-i-g), i-1);
- ans += max(0, lcp - i + 1);
- }
- }
- return ans;
- }
- };
- Suffix_array arr;
- char s[maxn];
- int main(){
- int T; cin >> T;
- for(int kase = 1; kase <= T; ++kase){
- scanf("%d", &n); arr.init();
- scanf("%s", s);
- int len = strlen(s);
- for(int i = 0; i < len; ++i) arr.s[arr.n++] = s[i] - 'a' + 1;
- arr.s[arr.n++] = 27;
- for(int i = len-1; i >= 0; --i) arr.s[arr.n++] = s[i] - 'a' + 1;
- arr.s[arr.n++] = 0;
- arr.build_sa(30);
- arr.getHight();
- arr.rmq_init();
- printf("Case %d: %lld\n", kase, arr.solve(len, n));
- }
- return 0;
- }
UVa 10829 L-Gap Substrings (后缀数组+rmq)的更多相关文章
- 【uva10829-求形如UVU的串的个数】后缀数组+rmq or 直接for水过
题意:UVU形式的串的个数,V的长度规定,U要一样,位置不同即为不同字串 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&am ...
- BZOJ 3277: 串/ BZOJ 3473: 字符串 ( 后缀数组 + RMQ + 二分 )
CF原题(http://codeforces.com/blog/entry/4849, 204E), CF的解法是O(Nlog^2N)的..记某个字符串以第i位开头的字符串对答案的贡献f(i), 那么 ...
- POJ 3693 后缀数组+RMQ
思路: 论文题 后缀数组&RMQ 有一些题解写得很繁 //By SiriusRen #include <cmath> #include <cstdio> #includ ...
- spoj687 REPEATS - Repeats (后缀数组+rmq)
A string s is called an (k,l)-repeat if s is obtained by concatenating k>=1 times some seed strin ...
- HDU 6194 string string string(后缀数组+RMQ)
string string string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- Codeforces Round #422 (Div. 2) E. Liar 后缀数组+RMQ+DP
E. Liar The first semester ended. You know, after the end of the first semester the holidays beg ...
- HDU2459 后缀数组+RMQ
题目大意: 在原串中找到一个拥有连续相同子串最多的那个子串 比如dababababc中的abababab有4个连续的ab,是最多的 如果有同样多的输出字典序最小的那个 这里用后缀数组解决问题: 枚举连 ...
- hdu 2459 (后缀数组+RMQ)
题意:让你求一个串中连续重复次数最多的串(不重叠),如果重复的次数一样多的话就输出字典序小的那一串. 分析:有一道比这个简单一些的题spoj 687, 假设一个长度为l的子串重复出现两次,那么它必然会 ...
- ural 1297(后缀数组+RMQ)
题意:就是让你求一个字符串中的最长回文,如果有多个长度相等的最长回文,那就输出第一个最长回文. 思路:这是后缀数组的一种常见的应用,首先把原始字符串倒转过来,然后接在原始字符串的后面,中间用一个不可能 ...
随机推荐
- Oracle SEQUENCE 具体说明
ORACLE SEQUENCE ORACLE没有自增数据类型,如需生成业务无关的主键列或惟一约束列,能够用sequence序列实现. CREATE SEQUENCE语句及參数介绍: 创建序 ...
- Oracle基本操作命令
一.Oracle监听命令 1.启动监听 lsnrctl start 五.Oracle 查看表空间的大小及使用情况sql语句 --1.查看表空间的名称及大小 SELECT t.tablespace_na ...
- IE9 下面, XMLHttpRequest 是不支持跨域请求的解决方法
在 IE9 下面, XMLHttpRequest 是不支持跨域请求的. IE10 的 XMLHttpRequest 支持跨域, 而 IE8, IE9 需要使用 XDomainRequest 来实现跨域 ...
- hadoop深入研究:(十三)——序列化框架
hadoop深入研究:(十三)--序列化框架 Mapreduce之序列化框架(转自http://blog.csdn.net/lastsweetop/article/details/9376495) 框 ...
- Centos 6 安装 配置 oracle11g R2
1.安装centos6.3_64位: 下载地址:http://mirror.bit.edu.cn/centos/6.3/isos/x86_64/ CentOS-6.3-x86_64-bin-DVD1. ...
- 【linux】linux权限管理
一.权限的基本概念 权限:访问计算机资源或服务的访问能力. Linux中,每一个资源或者服务的权限, ...
- 【翻译】HTML5开发——轻量级Web Database存储库html5sql.js
方式1: html5sql官方网址:http://html5sql.com/ 阅读之前,先看W3C关于WEB Database的一段话: Beware. This specification is n ...
- MFC vs. SDK程序流程
大家都知道,windows API编程以及其消息处理,其过程都清晰可见,大体步骤如下: 1)声明消息窗口类 2)注册窗口类 3)createwindows 4)消息获得以及分派(windows pro ...
- webpack和webpack-dev-server安装配置
本文转载自:https://www.cnblogs.com/xuehaoyue/p/6410095.html 跟着Webpack傻瓜式指南(一)这个教程在安装webpack和webpack-dev-s ...
- 学习笔记之Android
Android 开发专区 - 开源中国社区 http://www.oschina.net/android 探索 Android Studio | Android Studio https://deve ...