BZOJ 2894: 世界线 广义后缀自动机
Description
Input
Output
题解: 广义后缀自动机查询字典序第 $k$ 小,直接维护 $sumv[x]$ 表示以 $x$ 为根后面子串的个数,$dfs$ 一遍即可.
#include<bits/stdc++.h>
#define maxn 300000
#define ll long long
using namespace std;
vector<int>G[maxn];
char str[maxn];
int n,Q;
ll ans=1;
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
}
namespace SAM
{
int tot;
int ch[maxn<<1][28], f[maxn<<1], len[maxn<<1], cnt[maxn<<1], sumv[maxn<<1], C[maxn<<1], rk[maxn<<1];
char tr[maxn];
void init()
{
tot=1;
}
int extend(int c,int last)
{
int p=last;
if(!ch[p][c])
{
int np=++tot;
last=np, len[np]=len[p]+1;
while(p&&!ch[p][c])ch[p][c]=np,p=f[p];
if(!p) f[np]=1;
else
{
int q=ch[p][c];
if(len[q]==len[p]+1) f[np]=q;
else
{
int nq=++tot;
len[nq]=len[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
f[nq]=f[q], f[np]=f[q]=nq;
while(p&&ch[p][c]==q) ch[p][c]=nq, p=f[p];
}
}
ans+=len[np]-len[f[np]];
}
else
{
int q=ch[p][c];
if(len[q]==len[p]+1) last=q;
else
{
int nq=++tot;
len[nq]=len[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
f[nq]=f[q], f[q]=nq;
while(p&&ch[p][c]==q) ch[p][c]=nq,p=f[p];
last=nq;
}
}
return last;
}
void Get()
{
for(int i=1;i<=tot;++i) ++C[len[i]];
for(int i=1;i<=tot;++i) C[i]+=C[i-1];
for(int i=1;i<=tot;++i) rk[C[len[i]]--]=i;
for(int i=tot;i>=1;--i)
{
int p=rk[i];
sumv[p]=1;
for(int j=0;j<26;++j) if(ch[p][j]) sumv[p]+=sumv[ch[p][j]];
}
}
void solve(int k)
{
int cur=1,cc=0,flag2=1;
while(flag2 && cur)
{
flag2=0;
if(cur!=1) k-=1;
if(k<=0)
{
for(int i=1;i<=cc;++i) printf("%c",tr[i]);
puts("");
return;
}
for(int i=0;i<27;++i)
{
if(ch[cur][i])
{
if(sumv[ch[cur][i]] >= k)
{
cur=ch[cur][i];
tr[++cc]=i+'a';
flag2=1;
break;
}
else k-=sumv[ch[cur][i]];
}
}
}
puts("-1");
}
};
void DFS(int u,int fa,int cur)
{
cur=SAM::extend(str[u]-'a',cur); // 插入该字符后的状态
for(int i=0;i<G[u].size();++i)
{
int v=G[u][i];
if(v==fa) continue;
DFS(v,u,cur);
}
}
int main()
{
// setIO("input");
scanf("%d%d",&n,&Q);
scanf("%s",str+1);
for(int i=1,a,b;i<n;++i)
{
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
}
SAM::init();
DFS(1,0,1);
SAM::Get();
printf("%lld",ans);
puts("");
while(Q--)
{
int k;
scanf("%d",&k); --k;
if(k) SAM::solve(k);
else puts("");
}
return 0;
}
BZOJ 2894: 世界线 广义后缀自动机的更多相关文章
- BZOJ 3277 串 (广义后缀自动机)
3277: 串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 309 Solved: 118 [Submit][Status][Discuss] De ...
- BZOJ 3473: 字符串 [广义后缀自动机]
3473: 字符串 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 354 Solved: 160[Submit][Status][Discuss] ...
- BZOJ 3277/3473 广义后缀自动机
说实话没啥难的. 建一棵广义后缀自动机,暴力自底向上更新即可. 时间复杂度非常玄学,但据说是可以过的. 要注意每个串中相同的子串的贡献是都要加进去的,开始因为这个被坑了好久 QAQ Code: #in ...
- bzoj 3926 转换+广义后缀自动机
思路:重点在于叶子节点只有20个,我们把叶子节点提到根,把20个trie图插入后缀自动机,然后就是算有多少个本质不同的字串. #include<bits/stdc++.h> #define ...
- BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)
标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...
- BZOJ 3473 字符串 ——广义后缀自动机
这题就比较有趣了. 首先匹配一遍,然后统计子树叶子节点中包含大于等于k的节点个数(HH的项链) 然后就可以搞了. 关于合法的情况数,显然是l[i]-l[fa[i]],然后向下下传即可(YY一下). # ...
- BZOJ 3926 && ZJOI 2015 诸神眷顾的幻想乡 (广义后缀自动机)
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MB Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽 ...
- BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)
题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ...
- BZOJ.3926.[ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
题目链接 要对多个串同时建立SAM,有两种方法: 1.将所有串拼起来,中间用分隔符隔开,插入字符正常插入即可. 2.在这些串的Trie上建SAM.实际上并不需要建Trie,还是只需要正常插入(因为本来 ...
随机推荐
- Java Web文件下载
Web文件下载有两种.一种是文件在站点文件夹下.在浏览器中直接输入文件路径就可以下载.如http://www.xxx.com/file.zip.第二种是文件不在站点文件夹下或者文件是动态生成的(导出报 ...
- LeetCode 389. Find the Difference (找到不同)
Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...
- [POI 2018] Prawnicy
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5102 [算法] 首先,n条线段的交集一定是[Lmax,Rmin] , 其中,Lmax ...
- [模板]平衡树splay
气死我了,调了一个下午+两节课,各种大大小小的错误,各种调QAQ,最后总之是调出来了. 其实就是一个双旋操作,然后其他就是左儿子<当前节点<右儿子,剩下就是细节了. 题干: 题目描述 您需 ...
- eclipse和jdk版本对应问题
日常开发中,32位eclipse要用32位jdk,64位则必须要用64位jdk,否则启动时就会报错,load jvm.dll失败,昨天又遇到了这个问题.更换对应的版本之后就好了.tomcat等应用也有 ...
- 洛谷P2340 奶牛会展
题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由于负的智商或情商会造成 ...
- SQL service 自动解决依赖包 验证
依赖关系解决 ============================================================================================= ...
- 学学cookie和session
什么是Cookie? HTTP Cookie(也叫 Web Cookie或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器发起请求时被携带并发送到服 ...
- E20170916-hm
sassy adj. 无礼的; 漂亮的; <非正,美> <贬>粗鲁的; <褒>时髦的; digest vt. 消化; 整理; compressor n. 压气 ...
- C语言内存管理总结
更新: 2018/01/09 增加free() 更新: 2018/04/13 修改部分文字与表格背景色与默认颜色相同 //# TODO: malloc, alloc, calloc, realloc ...