http://www.lydsy.com/JudgeOnline/problem.php?id=3998

后缀自动机应用的一个模板?需要对len进行一个排序之后再统计每个出现的数量,维护的是以该字符串为前缀的字符串数量和某字符串的出现数量。

wa了两次,写题时犯得错误有:

1.使用样例检查出来向下搜索字符串时没有减去字符串本身出现的数量,比如样例中aabc 0 3,不计重复的情况下向下搜索还要多减一下a和aa分别出现的1次;

2.第一次wa检查出来val没有在建自动机的时候赋值,所以T=1的时候val和g都=0;

3.第二次wa检查半天自己随便打了个字符串跑一下发现数量不对,然后找了半天最后看出来是自己的ac自动机写错了一个len的赋值,太zz了orz。

还是要熟悉一下自动机的写法。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
int siz,T;
long long K;
char ch[maxn*]={};
int cnt[maxn*]={};//按照深度排序
int b[maxn*]={};//排序后每个的rk
long long val[maxn*]={};//每个状态出现的数目
long long g[maxn*]={};//每个状态及其所有以其为前缀后继的数目
struct nod{
int sig[];
int f,len;
void cle(){f=-;len=;memset(sig,-,sizeof(sig));}
}t[maxn*];
int las=,tot=;
void add(int z){
int x=++tot; t[x].cle();
t[x].len=t[las].len+;
val[x]=;
int i=las;
for(;i!=-&&t[i].sig[z]==-;i=t[i].f)
t[i].sig[z]=x;
if(i==-)t[x].f=;
else{
int p=t[i].sig[z];
if(t[p].len==t[i].len+)t[x].f=p;
else{
int y=++tot;t[y].cle();
t[y]=t[p];
t[y].len=t[i].len+;
t[x].f=t[p].f=y;
for(;i!=-&&t[i].sig[z]==p;i=t[i].f)
t[i].sig[z]=y;
}
}las=x;
}
void pai(){
for(int i=;i<=tot;i++)++cnt[t[i].len];
for(int i=;i<=siz;i++)if(i)cnt[i]+=cnt[i-];
for(int i=;i<=tot;i++)b[cnt[t[i].len]--]=i;
}
void doit(){
for(int i=tot+;i;i--){
int z=b[i];
if(T&&z)val[t[z].f]+=val[z];
else val[z]=;
}
val[]=;
for(int i=tot+;i;i--){
int z=b[i];
g[z]=val[z];
for(int j=;j<;j++)if(t[z].sig[j]!=-)g[z]+=g[t[z].sig[j]];
}
}
void getit(int x,long long k){
if(k<)return;
long long sum=;
for(int i=;i<;i++){
if(!t[x].sig[i])continue;
if(sum<k&&sum+g[t[x].sig[i]]>=k){
printf("%c",'a'+i);
getit(t[x].sig[i],k-sum-val[t[x].sig[i]]);
break;
}sum+=g[t[x].sig[i]];
}
}
int main(){
t[].cle();
scanf("%s",ch);siz=strlen(ch);
for(int i=;i<siz;i++)add(int(ch[i]-'a'));
pai();
scanf("%d%lld",&T,&K);
doit();
if(K>g[])printf("-1\n");
else getit(,(long long)K);
return ;
}

最新文章

  1. ASP.NET Aries 入门开发教程1:框架下载与运行
  2. django 第三天 有关库使用
  3. Android应用安全开发之浅谈网页打开APP
  4. Android studio2.2 ndk 错误 :format not a string literal and no format arguments!
  5. [PHP] - PDO事务操作
  6. Lucene-Analyzer
  7. WebSocket 基本函数
  8. workerman是一个高性能的PHP socket服务器框架
  9. Different ways to invoke a shared object/share library(.so)
  10. oracle update语句的几点写法
  11. C++中的函数指针和指针函数
  12. CentOS服务器下对mysql的优化
  13. JDK的dt.jar和Java BeanInfo接口
  14. VC++开发AutoCAD 2018/objectARX 用向导新建项目无法新建的问题
  15. 从池子里的beta看秋香, 个性迥异
  16. 微信小程序的同步操作
  17. github入门书籍总结
  18. 微软BI 之SSRS 系列 - 报表中分组聚合中处理不规则层次结构的技巧(没有子元素的时候不展开, 删除+符号)
  19. C# 中base和this关键字
  20. azure最佳实践系列1-自我修复的设计

热门文章

  1. $this-&gt;success传递数据
  2. oozie与mapreduce简单案例
  3. ueditor和thinkphp框架整合修改版
  4. 一键切图 PS 动作 【收藏】
  5. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树
  6. Deploy Openstack with RDO and Change VNC console to Spice
  7. 动态更新echart成交量柱状图,并且不重绘,类似K线的更新方式
  8. [ python ] 练习作业 - 1
  9. C# 多线程多文件批量下载---子线程中更新UI 实例
  10. linux系统kill一些类名称相同的进程