题意

第一问有一个经典做法:学习笔记

对于第二问,其实就是对于一个状态的所有串,第一问看成一个,第二问看成多个。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5*1e5+10;
int n,type,m,tot,last,cnt;
int head[maxn<<1],in[maxn<<1],size[maxn<<1];
ll f[maxn<<1];
char s[maxn];
struct edge{int to,nxt;}e[maxn<<2];
struct Sam
{
int fa,len;
int ch[26];
}sam[maxn<<1];
inline void add(int u,int v)
{
e[++cnt].nxt=head[u];
head[u]=cnt;
e[cnt].to=v;
in[v]++;
}
inline void sam_init(){sam[0].fa=-1,sam[0].len=0;last=0;}
inline void sam_add(int c)
{
int now=++tot;sam[now].len=sam[last].len+1;size[now]=1;
int p=last;
while(~p&&!sam[p].ch[c])sam[p].ch[c]=now,p=sam[p].fa;
if(p==-1){sam[now].fa=0;last=now;return;}
int q=sam[p].ch[c];
if(sam[q].len==sam[p].len+1)sam[now].fa=q;
else
{
int nowq=++tot;
sam[nowq].len=sam[p].len+1;
memcpy(sam[nowq].ch,sam[q].ch,sizeof(sam[q].ch));
sam[nowq].fa=sam[q].fa;sam[q].fa=sam[now].fa=nowq;
while(~p&&sam[p].ch[c]==q)sam[p].ch[c]=nowq,p=sam[p].fa;
}
last=now;
}
void dfs(int x)
{
for(int i=head[x];i;i=e[i].nxt)
dfs(e[i].to),size[x]+=size[e[i].to];
}
inline void work(int op)
{
if(op)
{
for(int i=1;i<=tot;i++)add(sam[i].fa,i);
dfs(0);
}
memset(head,0,sizeof(head));
memset(in,0,sizeof(in));
cnt=0;
for(int i=0;i<=tot;i++)
for(int j=0;j<26;j++)
if(sam[i].ch[j])add(sam[i].ch[j],i);
queue<int>q;
for(int i=0;i<=tot;i++)if(!in[i])q.push(i);
while(!q.empty())
{
int x=q.front();q.pop();
f[x]=!op?1:size[x];
//cerr<<f[x]<<endl;
for(int i=0;i<26;i++)if(sam[x].ch[i])f[x]+=f[sam[x].ch[i]];
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(!(--in[y]))q.push(y);
}
}
f[0]--;
//cerr<<f[0]<<endl;
}
int main()
{
scanf("%s%d%d",s+1,&type,&m);n=strlen(s+1);
sam_init();
for(int i=1;i<=n;i++)sam_add(s[i]-'a');
work(type);
if(m>f[0]){puts("-1");return 0;}
int now=0;
while(m)
{
for(int i=0;i<26;i++)
{
if(!sam[now].ch[i])continue;
if(f[sam[now].ch[i]]<m)m-=f[sam[now].ch[i]];
else
{
m-=!type?1:size[sam[now].ch[i]];now=sam[now].ch[i];
putchar(i+'a');break;
}
}
}
return 0;
}

luoguP3975 [TJOI2015]弦论的更多相关文章

  1. BZOJ 3998: [TJOI2015]弦论 [后缀自动机 DP]

    3998: [TJOI2015]弦论 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2152  Solved: 716[Submit][Status] ...

  2. Luogu P3975 [TJOI2015]弦论

    题目链接 \(Click\) \(Here\) 题目大意: 重复子串不算的第\(k\)大子串 重复子串计入的第\(k\)大子串 写法:后缀自动机. 和\(OI\) \(Wiki\)上介绍的写法不太一样 ...

  3. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  4. 【BZOJ 3998】 3998: [TJOI2015]弦论 (SAM )

    3998: [TJOI2015]弦论 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2627  Solved: 881 Description 对于一 ...

  5. 【BZOJ3998】[TJOI2015]弦论 后缀自动机

    [BZOJ3998][TJOI2015]弦论 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T ...

  6. BZOJ_3998_[TJOI2015]弦论_后缀自动机

    BZOJ_3998_[TJOI2015]弦论_后缀自动机 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行 ...

  7. bzoj3998: [TJOI2015]弦论(SAM+dfs)

    3998: [TJOI2015]弦论 题目:传送门 题解: SAM的入门题目(很好的复习了SAM并加强Right集合的使用) 其实对于第K小的字符串直接从root开始一通DFS就好,因为son边是直接 ...

  8. luogu P3975 [TJOI2015]弦论 SAM

    luogu P3975 [TJOI2015]弦论 链接 bzoj 思路 建出sam. 子串算多个的,统计preant tree的子树大小,否则就是大小为1 然后再统计sam的节点能走到多少串. 然后就 ...

  9. LGOJ3975 TJOI2015 弦论

    link:TJOI2015 弦论 题目大意: 给定一个字符串,输出在对该字符串所有的非空子串排序后第\(k\)个 另外的一个限制是\(T\):子串本质相同但位置不同算\(1\)或多个 \(|s| \l ...

随机推荐

  1. 201871010107-公海瑜《面向对象程序设计(java)》第一周学习总结

    201871010107-公海瑜<面向对象程序设计(java)>第一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/   ...

  2. 【CentOS7】CentOS7各个版本镜像下载地址(转)

    链接:https://www.cnblogs.com/caidingyu/p/10679422.html # CentOS7.6 下载地址       # CentOS-7-x86_64-DVD-18 ...

  3. 05_javaSE面试题:成员变量和局部变量

    题目 /** * 类变量:static修饰的 * 实例变量:不是static修饰的 * * 局部变量:栈 * 实例变量:堆 * 类变量:方法区 * @author kevin * @date 2019 ...

  4. 新书上线:《Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统》,欢迎大家买回去垫椅子垫桌脚

    新书上线 大家好,笔者的新书<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>已上线,此书内容充实.材质优良,乃家中必备垫桌脚 ...

  5. 使用 Hbuilder 连接手机调试移动端项目

    点击界面上的浏览器右侧的倒三角.   弹出列表以后,点击最后一行 “设置web服务器...”.继续弹出,点击右下角的“外置Web服务器设置”.   点新建.   弹出框后,填入“名称”和“浏览器运行U ...

  6. Leetcode练习题Search Insert Position

    Question: Given a sorted array and a target value, return the index if the target is found. If not, ...

  7. web自动化针对PO模式进行二次封装之basepage

    在PO模式当中,我们做到了页面对象与测试用例的分离,但在页面对象编写时,我们仍然还有优化的空间.页面对象有一些共同的基本操作,可以封装起来,并可以在基本操作当中加上日志和异常截图的处理.比如说我们在查 ...

  8. 一些常见的http状态码

    HTTP状态码是服务器和客户端之间交流信息的语言,下面列出一些常见的HTTP状态码. 1XX系列 指定客户端应相应的某些动作,代表请求已被接受,需要继续处理.由于在HTTP/1.0协议中没有定义任何1 ...

  9. wcharczuk/go-chart图表上使用中文字体

    https://github.com/wcharczuk/go-chart/ 默认使用的字体是 roboto.Roboto,不支持中文.  // GetDefaultFont returns the ...

  10. 使用Vuejs 开发chrome 插件的注意事项

    chrome 插件的开发其实并不难,web开发者可以使用 html, css, javascript 轻松的开发实用的 chrome 插件. 一个好的 chrome 插件可以提高我们的开发效率,甚至方 ...