题目

思路来源

官方题解

题解

用大于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-字符串(后缀数组)相关推荐

  1. Comet OJ - 2019国庆欢乐赛 G 后缀数组

    题目链接: https://www.cometoj.com/contest/68/problem/G?problem_id=3940 出题人给的题解: 我们知道,一个子串是字符串的后缀的前缀.  这就 ...

  2. Comet OJ - 2019国庆欢乐赛(赛后整理)

    Comet OJ - 2019国庆欢乐赛(赛后整理) 比赛链接:传送门 PS: 做题失误: A题wa了好久不知道为什么,后来才知道乘法爆long long了 B题思路错了,应该在想清楚些. 比赛过程中 ...

  3. 【Comet OJ - 2019国庆欢乐赛 F】 高速公路

    题意 一个长度为n的序列h[i]表示第i个位置的数不能超过h[i].每个数和相邻的数的差只能为-10,0或+10. 现在可以允许一个位置忽略限制,求数列中所有数的和最大为多少. 思路 算出没有忽略限制 ...

  4. Comet OJ - 2019国庆欢乐赛 D1 入学考试 (简单版)

    https://www.cometoj.com/contest/68/problem/D1?problem_id=3936 入学考试 (简单版) 枚举 已经做完的卷子数量 然后 剩下的时间 我们二分它 ...

  5. Comet OJ 2019 夏季欢乐赛题解

    Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...

  6. Comet OJ - 2019 六一欢乐赛

    传送门 #A: 思路:等差数列求和,看成俩次1+2+-+ n,多加的n减去,所以 ans = n*(n+1) - n. AC代码: 1 #include<iostream> 2 #incl ...

  7. Comet OJ - 2019六一欢乐赛

    这个题目我先写了些简单的 之后继续填坑: 比赛链接 题目链接 题目描述 小智是一名刚满十岁的男孩,住在真新镇中,他目标是成为一名优秀的宝可梦训练师,他明天就要从大木博士那里获得自己的第一只宝可梦了.博 ...

  8. Comet OJ - 2019六一欢乐赛C.收服宝可梦吧!

    题目描述 继上一话皮卡丘把那几个坏人炸飞之后,小智确认皮卡丘已经完全恢复了.于是带着皮卡丘继续上路,前往尼比市去,小霞为了她的脚踏车的事情也一直跟着小智. 在通往尼比市的路上,要经过一个漆黑的常磐森林 ...

  9. Comet OJ - 2019六一欢乐赛题解

    第001话 宝可梦,就决定是你了! 等差数列求和公式 #include <cstdio> #include <iostream> #include <vector> ...

最新文章

  1. Python中内建模块collections常见用法总结
  2. Spark学习之路 (二十二)SparkStreaming的官方文档
  3. 回顾2011年最热门的开源PHP项目
  4. 【原创视频】Docker总体架构设计及各模块原理剖析
  5. 北邮OJ 2016网预 - Saber's Conjecture
  6. http://hudeyong926.iteye.com/blog/977152
  7. 前端学习(3075):vue+element今日头条管理-反馈
  8. 编程题【Math类】计算类
  9. 【报告分享】2020年母婴未来消费新趋势报告.pdf(附下载链接)
  10. 送你一份有态度的红包封面!
  11. 最优化理论——最速下降法
  12. 计算机专业英语张强华答案,计算机专业英语答案
  13. java猴子搬香蕉,趣味算法:猴子搬香蕉问题
  14. 读书寄语之体现人生智慧的9个字
  15. 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
  16. PTB-XL大型的心电图数据集
  17. CodeCombat计算机科学6.14脆弱的迷宫
  18. PDPS软件:机器人仿真动画视频输出功能介绍与使用方法
  19. mysql_query('set names gbk')_mysql_query(SET NAMES 'GBK');SET NAMES 'GBK'是干什么的?什么意思?...
  20. 深圳大学计算机博士好考吗,深圳大学在职博士好考吗?

热门文章

  1. 论文初稿写到什么程度才算合格?
  2. ukf实测信号的预测 matlab,无迹卡尔曼滤波(UKF)在参数估计应用中迭代停滞问题
  3. 【chrome】chrome百度网盘网页版倍速
  4. 什么是G.652光缆
  5. android 屏幕方向监听,Android如何监听屏幕旋转
  6. Parallels Desktop 安装Win 10提示“安全启动功能防止操作系统启动”该怎么解决?
  7. foxmail清除无法清除的未读邮件
  8. 10G数据不用框架快速去重
  9. 招聘面试技巧(转载)
  10. 如何使LED灯泡变暗---凯利讯半导体