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. json格式键盘编码对照表

    整理了一份JSON格式的键盘编码对照表.欢迎转载,但请注明出处,谢谢! { VK_BACK: 8, //退格键 VK_TAB: 9, //TAB键 VK_RETURN: 13, //回车键 VK_SH ...

  2. enigma机的原理

    注:本文修改自三思科学<ENIGMA的兴亡>            ENIGMA ENIGMA看起来是一个装满了复杂而精致的元件的盒子.不过要是我们把它打开来,就可以看到它可以被分解成相当 ...

  3. memcached分布式实现原理

    摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...

  4. Cyclic Nacklace - HDU 3746(next求循环节)

    题目大意:给你一些串,问如果想让这个串里面的循环节至少循环两次,需要添加几个字符(只能在最前面或者最后面添加).比如ababc 需要添加5个就是添加ababc. 分析:其实字符串的长度len-next ...

  5. static作用——The static effect

    1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区). 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它 ...

  6. Linux 开机自检的设置(tune2fs和fsck)

      tune2fs和fsck的用法 tune2fs--调整ext2/ext3文件系统特性的工具. -l <device> 查看文件系统信息 -c <count> 设置强制自检的 ...

  7. 对于android拦截短信的一些疑问

    最近折腾android4.4短信拦截的问题,要求在app上收到短信的时候弹出提示,并显示的功能. 然后找到了使用broadcastreceiver和contentprovider两种方法,那么问题来了 ...

  8. Java基础知识强化之IO流笔记15:递归之删除带内容的目录案例

    1. 需求:递归删除带内容的目录 分析:   (1)封装目录   (2)获取该目录下的所有文件或者文件夹的File数组   (3)遍历该File数组,得到每一个File对象   (4)判断该File对 ...

  9. 9.13noip模拟试题

    题目名称 “与” 小象涂色 行动!行动! 输入文件 and.in elephant.in move.in 输出文件 and.out elephant.in move.in 时间限制 1s 1s 1s ...

  10. uva 11324 The Largest Clique (Tarjan+记忆化)

    /*每个环 要么不选 要么全选 可缩点 就得到一个GAD图 然后搞搞算出最大路径*/ #include<iostream> #include<cstdio> #include& ...