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

/*
这道题用到一个常用的技巧(虽然我这是第一次见)。
枚举U的长度,然后每隔U枚举i,然后确定j,则j一定在另一个U里面,有了i、j之后,向左向右扩展,看看能匹配多长。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 600010
using namespace std;
int t1[N],t2[N],c[N],s[N],sa[N],rk[N],height[N],n;
int st[N][],lg2[N];
char ch[N];
bool cmp(int *y,int a,int b,int k){
int a1=y[a],b1=y[b];
int a2=a+k<=n?y[a+k]:-;
int b2=b+k<=n?y[b+k]:-;
return a1==b1&&a2==b2;
}
void DA(){
int *x=t1,*y=t2,m=;
for(int i=;i<=m;i++) c[i]=;
for(int i=;i<=n;i++) c[x[i]=s[i]]++;
for(int i=;i<=m;i++) c[i]+=c[i-];
for(int i=n;i;i--) sa[c[x[i]]--]=i;
for(int k=,p=;k<=n;k*=,m=p,p=){
for(int i=n-k+;i<=n;i++) y[++p]=i;
for(int i=;i<=n;i++) if(sa[i]>k) y[++p]=sa[i]-k;
for(int i=;i<=m;i++) c[i]=;
for(int i=;i<=n;i++) c[x[y[i]]]++;
for(int i=;i<=m;i++) c[i]+=c[i-];
for(int i=n;i;i--) sa[c[x[y[i]]]--]=y[i];
swap(x,y);p=;x[sa[]]=;
for(int i=;i<=n;i++)
if(cmp(y,sa[i-],sa[i],k)) x[sa[i]]=p;
else x[sa[i]]=++p;
if(p>=n) break;
}
}
void geth(){
for(int i=;i<=n;i++) rk[sa[i]]=i;
for(int i=,j=;i<=n;i++){
while(s[i+j]==s[sa[rk[i]-]+j]) j++;
height[rk[i]]=j;
if(j) j--;
}
for(int i=;i<=n;i++) lg2[i]=lg2[i>>]+;
for(int i=;i<=n;i++) st[i][]=height[i];
for(int j=;(<<j)<=n;j++)
for(int i=;i+(<<j)-<=n;i++)
st[i][j]=min(st[i][j-],st[i+(<<j-)][j-]);
}
int query(int l,int r){
l=rk[l];r=rk[r];
if(l>r) swap(l,r);
int k=lg2[r-l];
return min(st[l+][k],st[r-(<<k)+][k]);
}
int main(){
int T;scanf("%d",&T);
for(int cas=;cas<=T;cas++){
long long ans=;int G;
scanf("%d%s",&G,ch+);
int len=strlen(ch+);
for(int i=;i<=len;i++) s[i]=s[len*-i+]=ch[i]-'a'+;
s[len+]=;n=len*+;
DA();geth();
for(int U=;U*+G<=len;U++)
for(int i=;i+U+G<=len;i+=U){
int j=i+U+G;
if(s[i]!=s[j]) continue;
int L=min(U,query(i,j))+min(U,query(len*-i+,len*-j+))-;//分别为向右和向左扩展
if(L>=U) ans+=L-U+;
}
cout<<"Case "<<cas<<": "<<ans<<endl;
}
return ;
}

最新文章

  1. C# 委托应用总结
  2. android多线程断点续传下载文件
  3. Codeigniter 3.0 相关文档 part two
  4. callback 转换到 promise
  5. 【手把手教你Elmah】如何在MVC.NET项目中在线查看【错误日志】
  6. UIActionSheet警告,提示调用showFromTabBar方法
  7. POJ 1847 Tram (最短路)
  8. phpstorm映射远程项目
  9. UIAutomator 学习版
  10. PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具 - 开源中国社区
  11. w3wp与w3svc
  12. Qt_DX
  13. Flex动态获取数据,服务中断报错
  14. 水晶报表中&quot;已达到系统管理员配置的最大报表处理作业数限制&quot;错误的处理
  15. 用c语言创建双向环形链表
  16. springboot 启动脚本
  17. OA系统高性能解决方案(史上最全的通达OA系统优化方案)
  18. Kubernetes部署ELK并使用Filebeat收集容器日志
  19. QT 窗口拖拽移动实现
  20. win8下硬盘安装Ubuntu12.04双系统成功记录

热门文章

  1. C/C++程序基础 (七)继承和多态
  2. 十二、MySQL 查询数据
  3. 动态规划:HDU1087-Super Jumping! Jumping! Jumping!(最大上升子序列和)
  4. BFS:CF356C-Compartments
  5. 【Python】函数参数类型及用法
  6. 使用Vue CLI3开发多页面应用
  7. 同步锁之lock
  8. virsh命令管理虚拟机
  9. 看似不是dfs的dfs HDU-1455
  10. C++指针详解 (转)