Description

有一种形如uvu形式的字符串,其中u是非空字符串,且V的长度正好为L,那么称这个字符串为L-Gap字符串
给出一个字符串S,以及一个正整数L,问S中有多少个L-Gap子串.

Input

第一行一个数字L
第二行一个字符串S

Output

一个数字表示S中有多少个L-Gap子串.

Sample Input

3
aabbaa

Sample Output

2

Hint

S的长度不超过50000,L<=10

 
题解:http://www.cnblogs.com/iamCYY/p/4730777.html
Orz CYY
 
code:
 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 50050
using namespace std;
char ch,s[maxn];
int n,l,ans;
int fa[maxn],root[maxn],list[maxn],cnt,que[maxn];
int SA[maxn],rank[maxn],height[maxn],sum[maxn],t1[maxn],t2[maxn];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
struct Splay{
int tot,son[maxn][],fa[maxn],siz[maxn],val[maxn];
void init(){
for (int i=;i<=n;i++) siz[++tot]=;
for (int i=;i<=n;i++) val[i]=SA[i];
}
int which(int x){return son[fa[x]][]==x;}
void update(int x){siz[x]=siz[son[x][]]+siz[son[x][]]+;}
void rotate(int x){
int y=fa[x],d=which(x),dd=which(y);
fa[son[x][d^]]=y,son[y][d]=son[x][d^],fa[x]=fa[y];
if (fa[x]) son[fa[x]][dd]=x;
son[x][d^]=y,fa[y]=x,update(y),update(x);
}
void splay(int x){
while (fa[x]){
if (!fa[fa[x]]) rotate(x);
else if (which(x)==which(fa[x])) rotate(fa[x]),rotate(x);
else rotate(x),rotate(x);
}
root[find(x)]=x;
}
void insert(int root,int x){
int f,t;
for (f=t=root;t;t=son[t][val[x]>val[t]]) f=t;
son[f][val[x]>val[f]]=x,fa[x]=f,splay(x);
}
void merge(int x){while (cnt) insert(root[x],que[cnt--]);}
int find_pre(int root,int v){
int x,t=;
for (x=root;x;val[x]<v?t=x,x=son[x][]:x=son[x][]);
if (t) splay(t);
return t?siz[son[t][]]+:;
}
int find_next(int root,int v){
int x,t=;
for (x=root;x;val[x]>v?t=x,x=son[x][]:x=son[x][]);
if (t) splay(t);
return t?siz[son[t][]]+:;
}
void get(int x){
if (son[x][]) get(son[x][]);
que[++cnt]=x;
if (son[x][]) get(son[x][]);
son[x][]=son[x][]=fa[x]=;
}
}T;
bool ok;
void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
bool cmp(int x,int y){
if (height[x]!=height[y]) return height[x]>height[y];
return x<y;
}
void get_SA(){
int *x=t1,*y=t2,m=,tot=;
for (int i=;i<=n;i++) sum[x[i]=s[i]]++;
for (int i=;i<=m;i++) sum[i]+=sum[i-];
for (int i=n;i>=;i--) SA[sum[x[i]]--]=i;
for (int len=;tot<n;len<<=,m=tot){
tot=;
for (int i=n-len+;i<=n;i++) y[++tot]=i;
for (int i=;i<=n;i++) if (SA[i]>len) y[++tot]=SA[i]-len;
for (int i=;i<=m;i++) sum[i]=;
for (int i=;i<=n;i++) sum[x[y[i]]]++;
for (int i=;i<=m;i++) sum[i]+=sum[i-];
for (int i=n;i>=;i--) SA[sum[x[y[i]]]--]=y[i];
swap(x,y),x[SA[]]=tot=;
for (int i=;i<=n;i++){
if (y[SA[i]]!=y[SA[i-]]||y[SA[i]+len]!=y[SA[i-]+len]) tot++;
x[SA[i]]=tot;
}
}
for (int i=;i<=n;i++) rank[i]=x[i];
}
void get_height(){
for (int i=,j=;i<=n;i++){
if (rank[i]==) continue;
while (s[i+j]==s[SA[rank[i]-]+j]) j++;
height[rank[i]]=j;
if (j>) j--;
}
}
int main(){
read(l),scanf("%s",s+),n=strlen(s+);
get_SA(),get_height(),T.init();
for (int i=;i<=n;i++) root[i]=i;
for (int i=;i<=n;i++) fa[i]=i;
for (int i=;i<n;i++) list[i]=i+;
sort(list+,list+n,cmp);
for (int i=;i<n;i++){
int x=find(list[i]-),y=find(list[i]),lcp=height[list[i]]; cnt=;
if (T.siz[root[x]]>T.siz[root[y]]) swap(x,y);
int tsiz=T.siz[root[y]];
T.get(root[x]);
for (int j=,t=que[j];j<=cnt;j++,t=que[j]){
ans+=T.find_next(root[y],SA[t]+l);
ans+=T.find_pre(root[y],lcp+SA[t]+l+)-tsiz;
ans+=T.find_next(root[y],SA[t]-lcp-l-);
ans+=T.find_pre(root[y],SA[t]-l)-tsiz;
}
fa[x]=y,T.merge(y);
}
printf("%d\n",ans);
return ;
}

bzoj2534: Uva10829L-gap字符串的更多相关文章

  1. 「BZOJ 2534」 L - gap字符串

    「BZOJ 2534」 L - gap字符串 题目描述 有一种形如 \(uv u\) 形式的字符串,其中 \(u\) 是非空字符串,且 \(v\) 的长度正好为 \(L\), 那么称这个字符串为 \( ...

  2. BZOJ2534 Uva10829L-gap字符串 字符串 SA ST表

    原文链接https://www.cnblogs.com/zhouzhendong/p/9240665.html 题目传送门 - BZOJ2534 题意 有一种形如 $uvu$ 形式的字符串,其中 $u ...

  3. 【做题】BZOJ2534 L-gap字符串——调和级数

    题意:给出一个字符串,问其中有多少个子串恰好为\(uvu\)的形式.其中,\(u\)非空,\(v\)的长度恰好为\(l\). \(n \leq 5 \times 10^4\) 我们设两个后缀的起点分别 ...

  4. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  5. JSON字符串转换成JSON对象

    字符串转对象(strJSON代表json字符串) var obj = eval(strJSON); var obj = strJSON.parseJSON(); var obj = JSON.pars ...

  6. 字符串hash函数

    本文搜集了一些字符串的常用hash函数. 范例1:判断两个单词是否含有相同的字母,此时我们可以用hash做.例如,“aaabb”与"aabb"含有相同的单词.(参考:http:// ...

  7. 第一百二十七节,JavaScript,JSON数据类型转换,数据转换成字符串,字符串转换成数据

    第一百二十七节,JavaScript,JSON数据类型转换,数据转换成字符串,字符串转换成数据 学习要点: 1.JSON语法 2.解析和序列化 前两章我们探讨了XML的结构化数据,但开发人员还是觉得这 ...

  8. Binary Gap(二进制空白)

    中文标题[二进制空白] 英文描述 A binary gap within a positive integer N is any maximal sequence of consecutive zer ...

  9. BWT转换对字符串进行编码

    今天看了下bowtie 的论文, 里面描述了BWT转换的过程和bowtie的比对算法: NGS测序数据的数据量非常大, 为了更快的处理, 通常需要对数据进行压缩:而BWT实际上就是一种数据转换方法, ...

随机推荐

  1. 《A First Course in Probability》-chaper5-连续型随机变量-均匀随机变量

    在连续随机变量这部分,有一种特殊的随机变量X,对于X所有可能取值,P(X)都相等,我们称其为均匀随机变量. 基于均匀随机变量的定义,我们容易看到,其密度函数f(x)必然是一条平行于x轴的直线,因为这样 ...

  2. 使用 HTMLTestRunner.py

    HTMLTestRunner.py python 2版本 下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html 教程:http://www. ...

  3. Period - HDU 1358(next求循环节)

    题目大意:有一个长N的字符串,如果前缀Ni是一个完全循环的串(循环次数大于1),输出Ni和它循环了多少次.   分析:输入next的应用,求出来next数组直接判断Ni是否是完全的循环就行了,也就是N ...

  4. 谈一下spring 的理解

    spring,大家基本都在使用,两个核心: 声明式事务AOP : 控制反转依赖注入IOC: 以前对控制反转和依赖注入很模糊,现在大概理解了意思,控制反转,有spring容易来控制bean 的创建,我们 ...

  5. [每日一题] OCP1z0-047 :2013-08-14 如何理解USING INDEX?...................................41

    正确答案:B 一.USING INDEX的实验: .USING INDEX可以让你在创建主键.唯一性约束的时候使用指定的索引或创建索引.或修改索引的存储结构. OK,我先不用USING INDEX,创 ...

  6. Hadoop HDFS (3) JAVA訪问HDFS

    如今我们来深入了解一下Hadoop的FileSystem类. 这个类是用来跟Hadoop的文件系统进行交互的.尽管我们这里主要是针对HDFS.可是我们还是应该让我们的代码仅仅使用抽象类FileSyst ...

  7. XTU OJ 1210 Happy Number (暴力+打表)

    Problem Description Recently, Mr. Xie learn the concept of happy number. A happy number is a number ...

  8. NYOJ 47过河问题

    主要思路:先排序.有两种可能是最小的情况,一种是让最小的去带着最大的过去,然后最小的再回来,还有一种就是先最小的和第二小的一块过去, 然后最小的回来,让最大的和第二大的过去,接着第二小的回来,第二小和 ...

  9. iOS图片拉伸

    常用的图片拉伸场景有:聊天页面的气泡,需要根据内容拉伸,但圆角拉伸后会变形,为避免圆角拉伸,可以指定拉伸区域.UIImage实体调用以下方法即可指定拉伸区域. - (UIImage *)stretch ...

  10. Vijos P1325桐桐的糖果计划(有向图双连通分量)

    /*重边不能删 不能删 不能删...*/ #include<iostream> #include<cstdio> #include<cstring> #define ...