Comet OJ - 2019国庆欢乐赛 G-字符串(后缀数组)
题目
思路来源
官方题解
题解
用大于z的字母将串分隔,值得一提,'z'+1=='{'
将询问串t1{t2{t3{tq{s接在一起
注意到最小k,即为s串内最前位置k
倒序遍历sa[]数组,更新在原串s中的最小位置pos,
遇到询问时,用sa[pos]子串回答,
特判长度越界则答案为-1,否则为当前pos子串对应的k
指针板子常数大的一批,和别的SA板子比起来简直……
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define Q 5005
#define N 410005
#define M 200005
int T,ans[Q],head[N];
int sum,len,sz[N],to[N];
char tmp[M];
struct SuffixArray
{#define N 410005#define M 200005char s[N],t[M];int n,m;int *x,*y,X[N],Y[N],c[N],sa[N];/*int height[N],Rank[N];void clear(){memset(X,0,sizeof(X));memset(Y,0,sizeof(Y));memset(c,0,sizeof(c));memset(sa,0,sizeof(sa));memset(height,0,sizeof(height));memset(Rank,0,sizeof(Rank));}*/void init(){scanf("%d",&T);scanf("%s",tmp);for(int i=1;i<=T;++i){scanf("%s",s+sum);sz[i]=len=strlen(s+sum);head[i]=sum;to[head[i]]=i;strcat(s,"{");sum+=len+1;}sz[0]=len=strlen(tmp); head[0]=sum;strcat(s,tmp);sum+=len;n=sum;//printf("s:%s\n",s);//for(int i=0;i<=T;++i)//printf("head[%d]:%d\n",i,head[i]);}void get_sa(int _m=30)//_m为字符集大小 {m=_m;x=X,y=Y;for (int i=0;i<m;++i) c[i]=0;for (int i=0;i<n;++i) x[i]=s[i]-'a',++c[x[i]];for (int i=0;i<m;++i) c[i]+=c[i-1];for (int i=n-1;i>=0;--i) sa[--c[x[i]]]=i;for (int k=1;k<=n;k<<=1){int p=0;for (int i=n-k;i<n;++i) y[p++]=i;for (int i=0;i<n;++i) if (sa[i]>=k) y[p++]=sa[i]-k;for (int i=0;i<m;++i) c[i]=0;for (int i=0;i<n;++i) ++c[x[y[i]]];for (int i=0;i<m;++i) c[i]+=c[i-1];for (int i=n-1;i>=0;--i) sa[--c[x[y[i]]]]=y[i];swap(x,y);p=1;x[sa[0]]=0;for (int i=1;i<n;++i)x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&((sa[i-1]+k<n?y[sa[i-1]+k]:-1)==(sa[i]+k<n?y[sa[i]+k]:-1))?p-1:p++;if (p>n) break;m=p;}}/*void get_height(){for (int i=0;i<n;++i) Rank[sa[i]]=i;int k=0;height[0]=0;for (int i=0;i<n;++i){if (!Rank[i]) continue;if (k) --k;int j=sa[Rank[i]-1];while (i+k<n&&j+k<n&&s[i+k]==s[j+k]) ++k;height[Rank[i]]=k;}}*/ //Rank[i]:下标位置在i的后缀的排名 //sa[i]:后缀排名第i的下标位置 //Rank和sa互为反函数 范围均在[0,n-1] //height[i]:排名第i和排名第i-1的LCP长度 /*void PR(){string p(s);for(int i=0;i<n;++i)printf("Rank[%d]:%d\n",i,Rank[i]);for(int i=0;i<n;++i){printf("sa[%d]:%d ",i,sa[i]);cout<<p.substr(sa[i])<<endl;}for(int i=0;i<n;++i)printf("height[%d]:%d\n",i,height[i]);}*/void solve(){int mn=0x3f3f3f3f;for(int i=n-1;i>=0;--i){if(sa[i]>=head[0])mn=min(mn,sa[i]);int id=to[sa[i]];if(id){if(mn+sz[id]-1>=sum)ans[id]=-1;else ans[id]=mn-head[0];}}for(int i=1;i<=T;++i)printf("%d\n",ans[i]);}
}sa;int main()
{//sa.clear();sa.init();sa.get_sa(30);//sa.get_height();//sa.PR();sa.solve();return 0;
}
Comet OJ - 2019国庆欢乐赛 G-字符串(后缀数组)相关推荐
- Comet OJ - 2019国庆欢乐赛 G 后缀数组
题目链接: https://www.cometoj.com/contest/68/problem/G?problem_id=3940 出题人给的题解: 我们知道,一个子串是字符串的后缀的前缀. 这就 ...
- Comet OJ - 2019国庆欢乐赛(赛后整理)
Comet OJ - 2019国庆欢乐赛(赛后整理) 比赛链接:传送门 PS: 做题失误: A题wa了好久不知道为什么,后来才知道乘法爆long long了 B题思路错了,应该在想清楚些. 比赛过程中 ...
- 【Comet OJ - 2019国庆欢乐赛 F】 高速公路
题意 一个长度为n的序列h[i]表示第i个位置的数不能超过h[i].每个数和相邻的数的差只能为-10,0或+10. 现在可以允许一个位置忽略限制,求数列中所有数的和最大为多少. 思路 算出没有忽略限制 ...
- Comet OJ - 2019国庆欢乐赛 D1 入学考试 (简单版)
https://www.cometoj.com/contest/68/problem/D1?problem_id=3936 入学考试 (简单版) 枚举 已经做完的卷子数量 然后 剩下的时间 我们二分它 ...
- Comet OJ 2019 夏季欢乐赛题解
Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...
- Comet OJ - 2019 六一欢乐赛
传送门 #A: 思路:等差数列求和,看成俩次1+2+-+ n,多加的n减去,所以 ans = n*(n+1) - n. AC代码: 1 #include<iostream> 2 #incl ...
- Comet OJ - 2019六一欢乐赛
这个题目我先写了些简单的 之后继续填坑: 比赛链接 题目链接 题目描述 小智是一名刚满十岁的男孩,住在真新镇中,他目标是成为一名优秀的宝可梦训练师,他明天就要从大木博士那里获得自己的第一只宝可梦了.博 ...
- Comet OJ - 2019六一欢乐赛C.收服宝可梦吧!
题目描述 继上一话皮卡丘把那几个坏人炸飞之后,小智确认皮卡丘已经完全恢复了.于是带着皮卡丘继续上路,前往尼比市去,小霞为了她的脚踏车的事情也一直跟着小智. 在通往尼比市的路上,要经过一个漆黑的常磐森林 ...
- Comet OJ - 2019六一欢乐赛题解
第001话 宝可梦,就决定是你了! 等差数列求和公式 #include <cstdio> #include <iostream> #include <vector> ...
最新文章
- Python中内建模块collections常见用法总结
- Spark学习之路 (二十二)SparkStreaming的官方文档
- 回顾2011年最热门的开源PHP项目
- 【原创视频】Docker总体架构设计及各模块原理剖析
- 北邮OJ 2016网预 - Saber's Conjecture
- http://hudeyong926.iteye.com/blog/977152
- 前端学习(3075):vue+element今日头条管理-反馈
- 编程题【Math类】计算类
- 【报告分享】2020年母婴未来消费新趋势报告.pdf(附下载链接)
- 送你一份有态度的红包封面!
- 最优化理论——最速下降法
- 计算机专业英语张强华答案,计算机专业英语答案
- java猴子搬香蕉,趣味算法:猴子搬香蕉问题
- 读书寄语之体现人生智慧的9个字
- 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
- PTB-XL大型的心电图数据集
- CodeCombat计算机科学6.14脆弱的迷宫
- PDPS软件:机器人仿真动画视频输出功能介绍与使用方法
- mysql_query('set names gbk')_mysql_query(SET NAMES 'GBK');SET NAMES 'GBK'是干什么的?什么意思?...
- 深圳大学计算机博士好考吗,深圳大学在职博士好考吗?
热门文章
- 论文初稿写到什么程度才算合格?
- ukf实测信号的预测 matlab,无迹卡尔曼滤波(UKF)在参数估计应用中迭代停滞问题
- 【chrome】chrome百度网盘网页版倍速
- 什么是G.652光缆
- android 屏幕方向监听,Android如何监听屏幕旋转
- Parallels Desktop 安装Win 10提示“安全启动功能防止操作系统启动”该怎么解决?
- foxmail清除无法清除的未读邮件
- 10G数据不用框架快速去重
- 招聘面试技巧(转载)
- 如何使LED灯泡变暗---凯利讯半导体