bzoj2534 Uva10829L-gap字符串(SA+lcp同bzoj2119)
求形如ABA的子串个数,同bzoj2119,题解看这里
tips:没说全是小写字母你就别换成int了。。。无谓的WA三发
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define N 50010
int n,k,Log[N];
ll ans=0;
char s[N];
inline int min(int x,int y){return x<y?x:y;}
struct SA{char a[N];int rank[N<<1],rank1[N],sa[N],h[N],count[N],tmp[N];int m,st[N][18];void init(){m=300;for(int i=1;i<=m;++i) count[i]=0;for(int i=1;i<=n;++i) count[a[i]]=1;for(int i=1;i<=m;++i) count[i]+=count[i-1];for(int i=n;i>=1;--i) rank[i]=count[a[i]];int k=0;for(int p=1;k!=n;p<<=1,m=k){for(int i=1;i<=m;++i) count[i]=0;for(int i=1;i<=n;++i) count[rank[i+p]]++;for(int i=1;i<=m;++i) count[i]+=count[i-1];for(int i=n;i>=1;--i) tmp[count[rank[i+p]]--]=i;for(int i=1;i<=m;++i) count[i]=0;for(int i=1;i<=n;++i) count[rank[tmp[i]]]++;for(int i=1;i<=m;++i) count[i]+=count[i-1];for(int i=n;i>=1;--i) sa[count[rank[tmp[i]]]--]=tmp[i];memcpy(rank1,rank,sizeof(rank1));rank[sa[1]]=k=1;for(int i=2;i<=n;++i){if(rank1[sa[i]]!=rank1[sa[i-1]]||rank1[sa[i]+p]!=rank1[sa[i-1]+p]) ++k;rank[sa[i]]=k;}}k=0;for(int i=1;i<=n;++i){if(rank[i]==1){h[1]=0;continue;}if(i==1||h[rank[i-1]]<=1) k=0;if(k) --k;while(a[i+k]==a[sa[rank[i]-1]+k]) ++k;h[rank[i]]=k; }for(int i=1;i<=n;++i) st[i][0]=h[i];for(int i=1;i<=Log[n];++i)for(int j=1;j<=n;++j)if(j+(1<<i-1)<=n) st[j][i]=min(st[j][i-1],st[j+(1<<i-1)][i-1]);}int lcp(int x,int y){int l=rank[x],r=rank[y];if(l>r) std::swap(l,r);l++;int t=Log[r-l+1];return min(st[l][t],st[r-(1<<t)+1][t]);}
}A,B;
void solve(int len){for(int i=1;i+len+k<=n;i+=len){int j=i+len+k;int r=A.lcp(i,j),l=B.lcp(n+1-i+1,n+1-j+1);if(r>len) r=len;if(l>len-1) l=len-1;if(l+r>=len) ans+=l+r-len+1;}
}
int main(){
// freopen("a.in","r",stdin);scanf("%d%s",&k,s+1);n=strlen(s+1);Log[0]=-1;for(int i=1;i<=n;++i) Log[i]=Log[i>>1]+1;for(int i=1;i<=n;++i) A.a[i]=s[i],B.a[i]=s[n-i+1];A.init();B.init();for(int i=1;i+i+k<=n;++i) solve(i);printf("%lld\n",ans);return 0;
}
bzoj2534 Uva10829L-gap字符串(SA+lcp同bzoj2119)相关推荐
- BZOJ3172 [Tjoi2013]单词 字符串 SA ST表
原文链接http://www.cnblogs.com/zhouzhendong/p/9026543.html 题目传送门 - BZOJ3172 题意 输入$n(n\leq 200)$个字符串,保证长度 ...
- BZOJ3230 相似子串 字符串 SA ST表
原文链接http://www.cnblogs.com/zhouzhendong/p/9033092.html 题目传送门 - BZOJ3230 题意 给定字符串$s$.长度为$n$. 现在有$Q$组询 ...
- P4094 [HEOI2016/TJOI2016]字符串 [SA + 主席树]
传送门 转换为判断,二分一个len,判断后缀起点在a -- b-mid+1 直接存不存在S, 使lcp(S,c)>= len,我们发现rank[S] 一定在c左右的一个范围内, 我们二分这个范围 ...
- 主席树 + 后缀数组求LCP + 二分套二分 ---- P4094 [HEOI2016/TJOI2016]字符串
题目链接 题目大意: 解题思路: 设我们的答案为midmidmid(注意这里有坑是[a,b][a,b][a,b]的所有子串和[c,d][c,d][c,d]这个子串的最长lcplcplcp),那么我们会 ...
- 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)
题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...
- YbtOJ-相似子串【SA,RMQ,二分】
正题 题目大意 给出一个长度为nnn的字符串,两个串相似当且仅当可以通过每种字符置换使得它们相同. qqq次询问这个字符串所有子串中和这个串中sl,rs_{l,r}sl,r子串有多少个相似的. 1≤ ...
- 基础省选+NOI-第6部分 字符串
1.Kmp KMP算法 KMP算法_哔哩哔哩_bilibili KMP算法计算next函数值(教材版,超简单!) KMP算法计算next函数值(教材版,超简单!)_哔哩哔哩_bilibili KMP算 ...
- 2020多校第1场A题【后缀数组+思维】
1.首先我们发现每个后缀开头一定是0,而且开头都是0..[若干个1]..0这种格式,按照字典序的排序方式那么如果两个0之间的1越少字典序就越小.例如aaaaab=>011110,aaab=> ...
- POJ 2217:Secretary(后缀数组)
题目大意:求两个字符串的公共子串. 分析: 模板题,将两个字符串接起来用不会出现的字符分割,然后求分属两个字符串的相邻后缀lcp的最大值即可. 代码: program work; typearr=ar ...
最新文章
- 二本毕业后3年发两篇Nature引热议,他此前研究刷新世界纪录
- ZooKeeper 定位:能解决什么问题?不能解决什么问题?
- Libevent:6辅助函数以及类型
- DropDownList and ListBox 两级联动菜单
- python取文件后缀
- 系统软硬件测试工具介绍
- 超详细|开关电源电路图及原理讲解
- 企业微信自建应用手动授权,获取用户详细信息
- xlistview的使用
- ACE的CDR中的字节对齐问题
- Open Replicator
- Docker容器技术 笔记
- 中山大学曾兆阳_官居几品怎么打压势力
- Git 右键不显示Git功能图标
- pdf转txt java_pdf转换txt怎么操作?pdf文件可以转换成txt文件吗?
- android 常用加密,分享一下Android各种类型的加密
- SAP-工艺路线相关的表的关联关系
- Tomcat8启动不了的问题
- ZOJ 3494 BCD code
- 小程序之mpvue使用