题解:

  枚举x位置,向左右延伸计算答案

  如何计算答案:对字符串建立SA,那么对于想双延伸的长度L,假如有lcp(i-L,i+1)>=L那么就可以更新答案

  复杂度  建立SA,LCP等nlogn,枚举X及向两边延伸26*n

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. #pragma comment(linker, "/STACK:102400000,102400000")
  8. #define ls i<<1
  9. #define rs ls | 1
  10. #define mid ((ll+rr)>>1)
  11. #define pii pair<int,int>
  12. #define MP make_pair
  13. typedef long long LL;
  14. const long long INF = 1e18+1LL;
  15. const double Pi = acos(-1.0);
  16. const int N = 1e5+, M = 2e5+, mod = 1e9+, inf = 2e9;
  17.  
  18. ///heght[i] 表示 Suffix(sa[i-1])和Suffix(sa[i]) 的最长公共前缀:
  19. ///rank[i] 表示 开头为i的后缀的等级:
  20. ///sa[i] 表示 排名为i的后缀 的开头位置:
  21. int *rank,r[N],sa[N],height[N],wa[N],wb[N],wm[N];
  22. bool cmp(int *r,int a,int b,int l) {
  23. return r[a] == r[b] && r[a+l] == r[b+l];
  24. }
  25. void SA(int *r,int *sa,int n,int m) {
  26. int *x=wa,*y=wb,*t;
  27. for(int i=;i<m;++i)wm[i]=;
  28. for(int i=;i<n;++i)wm[x[i]=r[i]]++;
  29. for(int i=;i<m;++i)wm[i]+=wm[i-];
  30. for(int i=n-;i>=;--i)sa[--wm[x[i]]]=i;
  31. for(int i=,j=,p=;p<n;j=j*,m=p){
  32. for(p=,i=n-j;i<n;++i)y[p++]=i;
  33. for(i=;i<n;++i)if(sa[i]>=j)y[p++]=sa[i]-j;
  34. for(i=;i<m;++i)wm[i]=;
  35. for(i=;i<n;++i)wm[x[y[i]]]++;
  36. for(i=;i<m;++i)wm[i]+=wm[i-];
  37. for(i=n-;i>=;--i)sa[--wm[x[y[i]]]]=y[i];
  38. for(t=x,x=y,y=t,i=p=,x[sa[]]=;i<n;++i) {
  39. x[sa[i]]=cmp(y,sa[i],sa[i-],j)?p-:p++;
  40. }
  41. }
  42. rank=x;
  43. }
  44. void Height(int *r,int *sa,int n) {
  45. for(int i=,j=,k=;i<n;height[rank[i++]]=k)
  46. for(k?--k:,j=sa[rank[i]-];r[i+k] == r[j+k];++k);
  47. }
  48.  
  49. int dp[N][],n;
  50. char a[N];
  51. void Lcp_init() {
  52. for(int i = ; i <= n; ++i) dp[i][] = height[i];
  53. for(int j = ; (<<j) <= n; ++j) {
  54. for(int i = ; i + (<<j) - <= n; ++i) {
  55. dp[i][j] = min(dp[i][j-],dp[i+(<<(j-))][j-]);
  56. }
  57. }
  58. }
  59. int lcp(int l,int r) {
  60. if(l > r) swap(l,r);
  61. l++;
  62. int len = r - l + ;
  63. int k = ;
  64. while((<<(k+)) <= len) k++;
  65. return min(dp[l][k],dp[r - (<<k) + ][k]);
  66. }
  67. int main() {
  68. int T;
  69. scanf("%d",&T);
  70. while(T--) {
  71. scanf("%s",a);
  72. n = strlen(a);
  73. for(int i = ; i < n; ++i) r[i] = a[i] - 'a' + ;
  74. r[n] = ;
  75. SA(r,sa,n+,);
  76. Height(r,sa,n);
  77. Lcp_init();
  78. LL ans = ;
  79. for(int i = ; i < n-; ++i) {
  80. int L = ;
  81. while(i - L >= && i + L < n) {
  82. if(a[i] == a[i-L] || a[i] == a[i + L]) break;
  83. if(lcp(rank[i-L],rank[i+]) >= L) ans += 1LL * (*L+) * (*L+);
  84. L++;
  85. }
  86. }
  87. printf("%I64d\n",ans);
  88. }
  89. return ;
  90. }

FZU 2137 奇异字符串 后缀树组+RMQ的更多相关文章

  1. 【BZOJ-1396&2865】识别子串&字符串识别 后缀自动机/后缀树组 + 线段树

    1396: 识别子串 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 312  Solved: 193[Submit][Status][Discuss] ...

  2. 【BZOJ3277/3473】串/字符串 后缀数组+二分+RMQ+双指针

    [BZOJ3277]串 Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Inpu ...

  3. CF504E Misha and LCP on Tree(树链剖分+后缀树组)

    1A真舒服. 喜闻乐见的树链剖分+SA. 一个初步的想法就是用树链剖分,把两个字符串求出然后hash+二分求lcp...不存在的. 因为考虑到这个字符串是有序的,我们需要把每一条重链对应的字符串和这个 ...

  4. HDU4436---str2int 后缀树组(12年天津区域赛)

    str2int Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  5. SPOJ694 -- DISUBSTR 后缀树组求不相同的子串的个数

    DISUBSTR - Distinct Substrings   Given a string, we need to find the total number of its distinct su ...

  6. POJ3581---Sequence 后缀树组

    题意:n个数字组成的序列,第一个数字最大,,把序列分成3部分,每个部分分别翻转,输出翻转后字典序最小的序列.. 后缀数组变一下,,先求出 第一个分割的位置,,然后再求一次后缀数组,,求出第二个位置.. ...

  7. 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

    涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...

  8. 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树

    另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...

  9. 洛谷P5284 [十二省联考2019]字符串问题 [后缀树]

    传送门 思路 设\(dp_i\)表示以\(i\)结尾的\(A\)串,能达到的最长长度. 然后发现这显然可以\(i\)往自己控制的\(k\)连边,\(k\)往能匹配的\(j\)连边,就是个最长路,只要建 ...

随机推荐

  1. 各种主流浏览器CSS、BUG兼容

    1.div的垂直居中问题 vertical-align:middle;将行距增加到和整个DIV一样高 line-height:200px;然后插入文字,就垂直居中了.缺点是要控制内容不要换行.---- ...

  2. 阿里云提示:对输入参数id未进行正确类型转义,导致整型注入的发生

    类似以下提示: XXX.php中,对输入参数id未进行正确类型转义,导致整型注入的发生 解决办法: 找到对应文件:$id = $_GET['id']; 增加以下标红过滤: $id = $_GET['i ...

  3. 【09-27】Spring 学习笔记

    SpringMVC 配置全局异常处理器 import javax.servlet.http.HttpServletResponse; import org.springframework.web.bi ...

  4. bootstrap中popover.js(弹出框)使用总结+案例

    bootstrap中popover.js(弹出框)使用总结+案例 *转载请注明出处: 作者:willingtolove: http://www.cnblogs.com/willingtolove/p/ ...

  5. 一道Apple公司(中国)的面试题目

    Apple在中国(上海)有公司业务,但是感觉主要是做测试工作的部门,主要是保障Apple的产品质量QE.面试的时候,面试官出了一道题目,我貌似曾今开过类似的题目,但是由于当场发挥不佳没有答出来.题目大 ...

  6. C# WinForm 技巧:COMBOBOX搜索提示

    comboBox和textBox支持内置的搜索提示功能, 在form的InitializeComponent()中添加如下语句:   this.comboBox1.AutoCompleteCustom ...

  7. JavaScript 智能社 完美运动框架

    简约版: function getStyle(obj, name) { if(obj.currentStyle) { return obj.currentStyle[name]; } else { r ...

  8. KMP专题

    1.[HDU 3336]Count the string(KMP+dp) 题意:求给定字符串含前缀的数量,如输入字符串abab,前缀是a.ab.aba.abab,在原字符串中出现的次数分别是2.2.1 ...

  9. 使用python抓取百度搜索、百度新闻搜索的关键词个数

    由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过pyth ...

  10. Linq学习笔记四之linq to sql 的基本操作

    首先需要在项目中新增一个 linq  to sql 的服务 新增项,数据,LINQ TO sql 类的这个方法 第二步需要一个model类,用作映射 [Table] public class S_ZD ...