FZU 2137 奇异字符串 后缀树组+RMQ
题解:
枚举x位置,向左右延伸计算答案
如何计算答案:对字符串建立SA,那么对于想双延伸的长度L,假如有lcp(i-L,i+1)>=L那么就可以更新答案
复杂度 建立SA,LCP等nlogn,枚举X及向两边延伸26*n
- #include<iostream>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- using namespace std;
- #pragma comment(linker, "/STACK:102400000,102400000")
- #define ls i<<1
- #define rs ls | 1
- #define mid ((ll+rr)>>1)
- #define pii pair<int,int>
- #define MP make_pair
- typedef long long LL;
- const long long INF = 1e18+1LL;
- const double Pi = acos(-1.0);
- const int N = 1e5+, M = 2e5+, mod = 1e9+, inf = 2e9;
- ///heght[i] 表示 Suffix(sa[i-1])和Suffix(sa[i]) 的最长公共前缀:
- ///rank[i] 表示 开头为i的后缀的等级:
- ///sa[i] 表示 排名为i的后缀 的开头位置:
- int *rank,r[N],sa[N],height[N],wa[N],wb[N],wm[N];
- bool cmp(int *r,int a,int b,int l) {
- return r[a] == r[b] && r[a+l] == r[b+l];
- }
- void SA(int *r,int *sa,int n,int m) {
- int *x=wa,*y=wb,*t;
- for(int i=;i<m;++i)wm[i]=;
- for(int i=;i<n;++i)wm[x[i]=r[i]]++;
- for(int i=;i<m;++i)wm[i]+=wm[i-];
- for(int i=n-;i>=;--i)sa[--wm[x[i]]]=i;
- for(int i=,j=,p=;p<n;j=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<m;++i)wm[i]=;
- for(i=;i<n;++i)wm[x[y[i]]]++;
- for(i=;i<m;++i)wm[i]+=wm[i-];
- for(i=n-;i>=;--i)sa[--wm[x[y[i]]]]=y[i];
- for(t=x,x=y,y=t,i=p=,x[sa[]]=;i<n;++i) {
- x[sa[i]]=cmp(y,sa[i],sa[i-],j)?p-:p++;
- }
- }
- rank=x;
- }
- void Height(int *r,int *sa,int n) {
- for(int i=,j=,k=;i<n;height[rank[i++]]=k)
- for(k?--k:,j=sa[rank[i]-];r[i+k] == r[j+k];++k);
- }
- int dp[N][],n;
- char a[N];
- void Lcp_init() {
- for(int i = ; i <= n; ++i) dp[i][] = height[i];
- for(int j = ; (<<j) <= n; ++j) {
- for(int i = ; i + (<<j) - <= n; ++i) {
- dp[i][j] = min(dp[i][j-],dp[i+(<<(j-))][j-]);
- }
- }
- }
- int lcp(int l,int r) {
- if(l > r) swap(l,r);
- l++;
- int len = r - l + ;
- int k = ;
- while((<<(k+)) <= len) k++;
- return min(dp[l][k],dp[r - (<<k) + ][k]);
- }
- int main() {
- int T;
- scanf("%d",&T);
- while(T--) {
- scanf("%s",a);
- n = strlen(a);
- for(int i = ; i < n; ++i) r[i] = a[i] - 'a' + ;
- r[n] = ;
- SA(r,sa,n+,);
- Height(r,sa,n);
- Lcp_init();
- LL ans = ;
- for(int i = ; i < n-; ++i) {
- int L = ;
- while(i - L >= && i + L < n) {
- if(a[i] == a[i-L] || a[i] == a[i + L]) break;
- if(lcp(rank[i-L],rank[i+]) >= L) ans += 1LL * (*L+) * (*L+);
- L++;
- }
- }
- printf("%I64d\n",ans);
- }
- return ;
- }
FZU 2137 奇异字符串 后缀树组+RMQ的更多相关文章
- 【BZOJ-1396&2865】识别子串&字符串识别 后缀自动机/后缀树组 + 线段树
1396: 识别子串 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 312 Solved: 193[Submit][Status][Discuss] ...
- 【BZOJ3277/3473】串/字符串 后缀数组+二分+RMQ+双指针
[BZOJ3277]串 Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Inpu ...
- CF504E Misha and LCP on Tree(树链剖分+后缀树组)
1A真舒服. 喜闻乐见的树链剖分+SA. 一个初步的想法就是用树链剖分,把两个字符串求出然后hash+二分求lcp...不存在的. 因为考虑到这个字符串是有序的,我们需要把每一条重链对应的字符串和这个 ...
- HDU4436---str2int 后缀树组(12年天津区域赛)
str2int Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- SPOJ694 -- DISUBSTR 后缀树组求不相同的子串的个数
DISUBSTR - Distinct Substrings Given a string, we need to find the total number of its distinct su ...
- POJ3581---Sequence 后缀树组
题意:n个数字组成的序列,第一个数字最大,,把序列分成3部分,每个部分分别翻转,输出翻转后字典序最小的序列.. 后缀数组变一下,,先求出 第一个分割的位置,,然后再求一次后缀数组,,求出第二个位置.. ...
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- 洛谷P5284 [十二省联考2019]字符串问题 [后缀树]
传送门 思路 设\(dp_i\)表示以\(i\)结尾的\(A\)串,能达到的最长长度. 然后发现这显然可以\(i\)往自己控制的\(k\)连边,\(k\)往能匹配的\(j\)连边,就是个最长路,只要建 ...
随机推荐
- 各种主流浏览器CSS、BUG兼容
1.div的垂直居中问题 vertical-align:middle;将行距增加到和整个DIV一样高 line-height:200px;然后插入文字,就垂直居中了.缺点是要控制内容不要换行.---- ...
- 阿里云提示:对输入参数id未进行正确类型转义,导致整型注入的发生
类似以下提示: XXX.php中,对输入参数id未进行正确类型转义,导致整型注入的发生 解决办法: 找到对应文件:$id = $_GET['id']; 增加以下标红过滤: $id = $_GET['i ...
- 【09-27】Spring 学习笔记
SpringMVC 配置全局异常处理器 import javax.servlet.http.HttpServletResponse; import org.springframework.web.bi ...
- bootstrap中popover.js(弹出框)使用总结+案例
bootstrap中popover.js(弹出框)使用总结+案例 *转载请注明出处: 作者:willingtolove: http://www.cnblogs.com/willingtolove/p/ ...
- 一道Apple公司(中国)的面试题目
Apple在中国(上海)有公司业务,但是感觉主要是做测试工作的部门,主要是保障Apple的产品质量QE.面试的时候,面试官出了一道题目,我貌似曾今开过类似的题目,但是由于当场发挥不佳没有答出来.题目大 ...
- C# WinForm 技巧:COMBOBOX搜索提示
comboBox和textBox支持内置的搜索提示功能, 在form的InitializeComponent()中添加如下语句: this.comboBox1.AutoCompleteCustom ...
- JavaScript 智能社 完美运动框架
简约版: function getStyle(obj, name) { if(obj.currentStyle) { return obj.currentStyle[name]; } else { r ...
- KMP专题
1.[HDU 3336]Count the string(KMP+dp) 题意:求给定字符串含前缀的数量,如输入字符串abab,前缀是a.ab.aba.abab,在原字符串中出现的次数分别是2.2.1 ...
- 使用python抓取百度搜索、百度新闻搜索的关键词个数
由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过pyth ...
- Linq学习笔记四之linq to sql 的基本操作
首先需要在项目中新增一个 linq to sql 的服务 新增项,数据,LINQ TO sql 类的这个方法 第二步需要一个model类,用作映射 [Table] public class S_ZD ...