正题


题目大意

一个字符串SSS。

若干个询问,每次询问一个串TTT和l,rl,rl,r。询问有多少个TTT和SSS的公共子串满足和为[l,r][l,r][l,r]


解题思路

考虑枚举子串左端,那么右串一定在一个范围内,考虑如何求出一个范围。

考虑用后缀数组解决这个问题,我们把所有串拼在一起。对与每个在TTT里的后缀,我们要找到左右边的第一个SSS里的后缀,然后用树状数组维护答案。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mp(x,y) make_pair(x,y)
#define lowbit(x) (x&-x)
using namespace std;
const int N=6e5+10,lim=2e6;
int n,m,q,s[N],l[N],height[N],L[N],R[N];
int x[N],y[N],sa[N],rk[N],c[N];
pair<int,int> p[N];
vector<int> v[N],wz[N];
char st[N];
struct Tree_Array{int t[lim+10];void Change(int x,int val){x++;while(x<=lim){t[x]+=val;x+=lowbit(x);}return;}int Ask(int x){int ans=0;x++;if(x<0)return 0;while(x){ans+=t[x];x-=lowbit(x);}return ans;}
}T;
void Init(){scanf("%s",st+1);n=strlen(st+1);for(int i=1;i<=n;i++)s[i]=st[i]-'0'+1;scanf("%d",&q);for(int i=1;i<=q;i++){scanf("%s",st+1);l[i]=strlen(st+1);s[++n]=11;for(int j=1;j<=l[i];j++){s[++n]=st[j]-'0'+1,p[n]=mp(i,j);v[i].push_back(-1); wz[i].push_back(n);}scanf("%d%d",&L[i],&R[i]);}
}
void Qsort(){for(int i=1;i<=m;i++)c[i]=0;for(int i=1;i<=n;i++)c[x[i]]++;for(int i=1;i<=m;i++)c[i]+=c[i-1];for(int i=n;i>=1;i--)sa[c[x[y[i]]]--]=y[i],y[i]=0;
}
void Get_SA(){m=11;for(int i=1;i<=n;i++)x[i]=s[i],y[i]=i;Qsort();for(int w=1;w<=n;w<<=1){int p=0;for(int i=n-w+1;i<=n;i++)y[++p]=i;for(int i=1;i<=n;i++)if(sa[i]>w)y[++p]=sa[i]-w;Qsort();swap(x,y);x[sa[1]]=p=1;for(int i=2;i<=n;i++)x[sa[i]]=(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+w]==y[sa[i-1]+w])?p:++p;if(p==n)break;m=p;}return;
}
void Get_Height(){int k=0;for(int i=1;i<=n;i++)rk[sa[i]]=i;for(int i=1;i<=n;i++){if(rk[i]==1)continue;if(k)k--;int j=sa[rk[i]-1];while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k])++k;height[rk[i]]=k;}return;
}
void Solve(){int w=2147483647/3,flag=0;for(int i=1;i<=n;i++){int x=sa[i];if(!p[x].first)w=2147483647/3,flag=1;else{if(flag){w=min(w,height[i]);v[p[x].first][p[x].second]=w;}}}w=2147483647/3;flag=0;for(int i=n;i>=1;i--){int x=sa[i]; if(!p[x].first)w=height[i],flag=1;else{if(flag){v[p[x].first][p[x].second]=max(v[p[x].first][p[x].second],w);w=min(w,height[i]);}}}return;
}
void Get_Ans(){for(int x=1;x<=q;x++){T.Change(0,1);int sum=0,k=0,r=l[x];long long ans=0;for(int i=l[x];i>=1;i--){sum+=s[wz[x][i-1]]-1;while(r&&r>=i+v[x][i]){r--;T.Change(k,-1);k+=s[wz[x][r]]-1;}ans+=T.Ask(sum-L[x])-T.Ask(sum-R[x]-1);T.Change(sum,1);}while(r){r--;T.Change(k,-1);k+=s[wz[x][r]]-1;}T.Change(k,-1);printf("%lld\n",ans);}return;
}
int main()
{Init();Get_SA();Get_Height();Solve();Get_Ans();
}

[2020.10.30NOIP模拟赛]字符串水题【SA,树状数组】相关推荐

  1. 2018蓝桥杯模拟赛·青出于蓝而胜于蓝 DFS序+树状数组

    武当派一共有 nnn 人,门派内 nnn 人按照武功高低进行排名,武功最高的人排名第 111,次高的人排名第 222,... 武功最低的人排名第 nnn.现在我们用武功的排名来给每个人标号,除了祖师爷 ...

  2. [2020.10.30NOIP模拟赛]小鱼吃大鱼【RMQ】

    正题 题目大意 nnn个数,求一对(i,j)(i,j)(i,j)要求最大化max{ai,aj}%min{ai,aj}max\{a_i,a_j\}\% min\{a_i,a_j\}max{ai​,aj​ ...

  3. YbtOJ#20237-[冲刺NOIP2020模拟赛Day10]区间均值【树状数组】

    正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/1 题目大意 nnn个数字的序列,求有多少个区间[l,r][l,r][l,r]的平均值在[L,R ...

  4. hdu4339 Query (字符串公共长度,树状数组+二分)

    题意: 给两个字符串s1,s2(长度可能不同) 和m次操作 操作有两种: (1 a i c)表示把第a个字符串的第i个字符改成字符c (其中a为1或者2) (2 i)输出最大的j,满足两个字符串在区间 ...

  5. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  6. 2020/10/31模拟赛

    CSP第二轮前模拟赛 我太菜了 T1 题目描述 奶牛们对围栏的高度非常敏感.奶牛希望围栏高度既不太矮以至于他们没有安全感,也不太高以至于她们看不见围栏外的天地.所以每头奶牛都有自己喜欢的高度.奶牛有N ...

  7. 【2018ACM山东省赛 - E】Sequence(树状数组,思维,优化)

    题干: We define an element aia_iai​ in a sequence "good", if and only if there exists a j(1≤ ...

  8. [2020.10.25NOIP模拟赛]序列【Splay】

    正题 题目链接:https://www.luogu.com.cn/problem/U136336?contestId=36038 题目大意 第iii次找到第iii大的数字位置xix_ixi​并且翻转[ ...

  9. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

最新文章

  1. uboot学习之BL3的流程
  2. 【转】.NET程序内存分析工具CLRProfiler的使用
  3. 敏捷开发一千零一问系列之十四:敏捷开发加班吗?
  4. 程序员面试金典——5.6奇偶位交换
  5. 用CDR(coreldraw)怎么把图片转为矢量图
  6. oracle获取timestamp日期,oracle日期时间型timestamp的深入理解
  7. 无人机航拍全景图拍摄教程技巧分享
  8. IDEA 默认浏览器修改设置
  9. 计算机网络的组成和主要功能,计算机网络的组成与功能
  10. ip漂移技术_您的项目是否遭受技术漂移的困扰?
  11. LEAM(生活/生命体验算法模型)
  12. 争对让望对思野葛对山栀注解_解析
  13. 学计算机要买什么笔记本,学计算机的买什么笔记本
  14. android app程序闪退原因分析
  15. 2020-08-09 我来邀请码
  16. 如何精心打造一句15字的战略宣言?
  17. Java每天10道面试题,跟我走,offer有!(十)
  18. 光纤连接器的种类你知道吗?
  19. torch.cat()函数 ,关于四维tensor维度合并。
  20. 天道好轮回苍天饶过谁万般皆是命半点不由人——循环

热门文章

  1. set-cookie 和 cookie 的区别_Go Web 编程如何确保Cookie数据的安全传输
  2. php和web服务器,php与web服务器关系
  3. vue html引入图片,vue引入图片的几种方式
  4. php sequelize,node,express_sequelize 联合查询,node,express,mysql,sequelize - phpStudy
  5. python时钟罗盘酷炫代码_抖音上的时钟屏保,被我改造完用来表白
  6. python没有菜单栏怎么搞mac_Mac 下 sublime 怎么调出顶端菜单栏
  7. realloc函_[转载]realloc函数的使用及注意事项(转)
  8. 类加载机制(整个过程详解)
  9. jsp解决mysql乱码_jsp+mysql时乱码的解决
  10. Pycharm安装第三方库