题意:给定上一个串,问你多少种UVU这一种形式的串,其中U不为空并且V的长度给定了。

析:枚举 U 的长度L,那么U一定是经过 0 L 2L 3L .... 其中的一个,所以求两个长度反lcp,一个向前延伸lcp1,一个向后延伸lcp2,然后加起来,要保证每个都不超过L,否则就会重复,然后个数就是 lcp1+lcp2-L。

代码如下:

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <iostream>
  7. #include <cstring>
  8. #include <set>
  9. #include <queue>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <map>
  13. #include <cctype>
  14. #include <cmath>
  15. #include <stack>
  16. #include <sstream>
  17. #include <list>
  18. #include <assert.h>
  19. #include <bitset>
  20. #define debug() puts("++++");
  21. #define gcd(a, b) __gcd(a, b)
  22. #define lson l,m,rt<<1
  23. #define rson m+1,r,rt<<1|1
  24. #define fi first
  25. #define se second
  26. #define pb push_back
  27. #define sqr(x) ((x)*(x))
  28. #define ms(a,b) memset(a, b, sizeof a)
  29. #define sz size()
  30. #define pu push_up
  31. #define pd push_down
  32. #define cl clear()
  33. #define all 1,n,1
  34. #define FOR(i,x,n) for(int i = (x); i < (n); ++i)
  35. #define freopenr freopen("in.txt", "r", stdin)
  36. #define freopenw freopen("out.txt", "w", stdout)
  37. using namespace std;
  38.  
  39. typedef long long LL;
  40. typedef unsigned long long ULL;
  41. typedef pair<int, int> P;
  42. const int INF = 0x3f3f3f3f;
  43. const double inf = 1e20;
  44. const double PI = acos(-1.0);
  45. const double eps = 1e-8;
  46. const int maxn = 1e5 + 10;
  47. const int maxm = 1e6 + 10;
  48. const int mod = 50007;
  49. const int dr[] = {-1, 0, 1, 0};
  50. const int dc[] = {0, -1, 0, 1};
  51. const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
  52. int n, m;
  53. const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  54. const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  55. inline bool is_in(int r, int c) {
  56. return r >= 0 && r < n && c >= 0 && c < m;
  57. }
  58. struct Suffix_array{
  59. int s[maxn], sa[maxn], t[maxn], t2[maxn];
  60. int c[maxn], h[maxn], r[maxn];
  61. int n;
  62. int dp[maxn][20];
  63. void init(){ n = 0; ms(sa, 0); }
  64.  
  65. void build_sa(int m){
  66. int *x = t, *y = t2;
  67. for(int i = 0; i < m; ++i) c[i] = 0;
  68. for(int i = 0; i < n; ++i) ++c[x[i] = s[i]];
  69. for(int i = 1; i < m; ++i) c[i] += c[i-1];
  70. for(int i = n-1; i >= 0; --i) sa[--c[x[i]]] = i;
  71.  
  72. for(int k = 1; k <= n; k <<= 1){
  73. int p = 0;
  74. for(int i = n-k; i < n; ++i) y[p++] = i;
  75. for(int i = 0; i < n; ++i) if(sa[i] >= k) y[p++] = sa[i] - k;
  76. for(int i = 0; i < m; ++i) c[i] = 0;
  77. for(int i = 0; i < n; ++i) ++c[x[y[i]]];
  78. for(int i = 1; i < m; ++i) c[i] += c[i-1];
  79. for(int i = n-1; i >= 0; --i) sa[--c[x[y[i]]]] = y[i];
  80.  
  81. swap(x, y);
  82. p = 1; x[sa[0]] = 0;
  83. for(int i = 1; i < n; ++i)
  84. x[sa[i]] = y[sa[i]] == y[sa[i-1]] && y[sa[i]+k] == y[sa[i-1]+k] ? p - 1 : p++;
  85. if(p >= n) break;
  86. m = p;
  87. }
  88. }
  89.  
  90. void getHight(){
  91. int k = 0;
  92. for(int i = 0; i < n; ++i) r[sa[i]] = i;
  93. for(int i = 0; i < n; ++i){
  94. if(k) --k;
  95. int j = sa[r[i]-1];
  96. while(s[i+k] == s[j+k]) ++k;
  97. h[r[i]] = k;
  98. }
  99. }
  100.  
  101. void rmq_init(){
  102. for(int i = 1; i <= n; ++i) dp[i][0] = h[i];
  103. for(int j = 1; (1<<j) <= n; ++j)
  104. for(int i = 1; i + (1<<j) <= n; ++i)
  105. dp[i][j] = min(dp[i][j-1], dp[i+(1<<j-1)][j-1]);
  106. }
  107.  
  108. int query(int L, int R){
  109. L = r[L]; R = r[R];
  110. if(L > R) swap(L, R);
  111. ++L;
  112. int k = log(R - L + 1.0) / log(2.0);
  113. return min(dp[L][k], dp[R-(1<<k)+1][k]);
  114. }
  115.  
  116. LL solve(int len, int g){
  117. LL ans = 0;
  118. for(int i = 1; i < len; ++i){
  119. for(int j = 0; j + i + g < len; j += i){
  120. int lcp = min(i, query(j, j+i+g)) + min(query(n-1-j, n-1-j-i-g), i-1);
  121. ans += max(0, lcp - i + 1);
  122. }
  123. }
  124. return ans;
  125. }
  126. };
  127.  
  128. Suffix_array arr;
  129. char s[maxn];
  130.  
  131. int main(){
  132. int T; cin >> T;
  133. for(int kase = 1; kase <= T; ++kase){
  134. scanf("%d", &n); arr.init();
  135. scanf("%s", s);
  136. int len = strlen(s);
  137. for(int i = 0; i < len; ++i) arr.s[arr.n++] = s[i] - 'a' + 1;
  138. arr.s[arr.n++] = 27;
  139. for(int i = len-1; i >= 0; --i) arr.s[arr.n++] = s[i] - 'a' + 1;
  140. arr.s[arr.n++] = 0;
  141. arr.build_sa(30);
  142. arr.getHight();
  143. arr.rmq_init();
  144. printf("Case %d: %lld\n", kase, arr.solve(len, n));
  145. }
  146. return 0;
  147. }

  

UVa 10829 L-Gap Substrings (后缀数组+rmq)的更多相关文章

  1. 【uva10829-求形如UVU的串的个数】后缀数组+rmq or 直接for水过

    题意:UVU形式的串的个数,V的长度规定,U要一样,位置不同即为不同字串 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&am ...

  2. BZOJ 3277: 串/ BZOJ 3473: 字符串 ( 后缀数组 + RMQ + 二分 )

    CF原题(http://codeforces.com/blog/entry/4849, 204E), CF的解法是O(Nlog^2N)的..记某个字符串以第i位开头的字符串对答案的贡献f(i), 那么 ...

  3. POJ 3693 后缀数组+RMQ

    思路: 论文题 后缀数组&RMQ 有一些题解写得很繁 //By SiriusRen #include <cmath> #include <cstdio> #includ ...

  4. 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 ...

  5. HDU 6194 string string string(后缀数组+RMQ)

    string string string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. 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 ...

  7. HDU2459 后缀数组+RMQ

    题目大意: 在原串中找到一个拥有连续相同子串最多的那个子串 比如dababababc中的abababab有4个连续的ab,是最多的 如果有同样多的输出字典序最小的那个 这里用后缀数组解决问题: 枚举连 ...

  8. hdu 2459 (后缀数组+RMQ)

    题意:让你求一个串中连续重复次数最多的串(不重叠),如果重复的次数一样多的话就输出字典序小的那一串. 分析:有一道比这个简单一些的题spoj 687, 假设一个长度为l的子串重复出现两次,那么它必然会 ...

  9. ural 1297(后缀数组+RMQ)

    题意:就是让你求一个字符串中的最长回文,如果有多个长度相等的最长回文,那就输出第一个最长回文. 思路:这是后缀数组的一种常见的应用,首先把原始字符串倒转过来,然后接在原始字符串的后面,中间用一个不可能 ...

随机推荐

  1. Oracle SEQUENCE 具体说明

     ORACLE  SEQUENCE     ORACLE没有自增数据类型,如需生成业务无关的主键列或惟一约束列,能够用sequence序列实现. CREATE SEQUENCE语句及參数介绍: 创建序 ...

  2. Oracle基本操作命令

    一.Oracle监听命令 1.启动监听 lsnrctl start 五.Oracle 查看表空间的大小及使用情况sql语句 --1.查看表空间的名称及大小 SELECT t.tablespace_na ...

  3. IE9 下面, XMLHttpRequest 是不支持跨域请求的解决方法

    在 IE9 下面, XMLHttpRequest 是不支持跨域请求的. IE10 的 XMLHttpRequest 支持跨域, 而 IE8, IE9 需要使用 XDomainRequest 来实现跨域 ...

  4. hadoop深入研究:(十三)——序列化框架

    hadoop深入研究:(十三)--序列化框架 Mapreduce之序列化框架(转自http://blog.csdn.net/lastsweetop/article/details/9376495) 框 ...

  5. 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. ...

  6. 【linux】linux权限管理

    一.权限的基本概念                                                   权限:访问计算机资源或服务的访问能力. Linux中,每一个资源或者服务的权限, ...

  7. 【翻译】HTML5开发——轻量级Web Database存储库html5sql.js

    方式1: html5sql官方网址:http://html5sql.com/ 阅读之前,先看W3C关于WEB Database的一段话: Beware. This specification is n ...

  8. MFC vs. SDK程序流程

    大家都知道,windows API编程以及其消息处理,其过程都清晰可见,大体步骤如下: 1)声明消息窗口类 2)注册窗口类 3)createwindows 4)消息获得以及分派(windows pro ...

  9. webpack和webpack-dev-server安装配置

    本文转载自:https://www.cnblogs.com/xuehaoyue/p/6410095.html 跟着Webpack傻瓜式指南(一)这个教程在安装webpack和webpack-dev-s ...

  10. 学习笔记之Android

    Android 开发专区 - 开源中国社区 http://www.oschina.net/android 探索 Android Studio | Android Studio https://deve ...