CF235C 【Cyclical Quest】
厚颜无耻的发一篇可能是全网最劣解法
我们发现要求给定的串所有不同的循环同构出现的次数,可以直接暴力啊
因为一个长度为\(n\)的串,不同的循环同构次数显然是不会超过\(n\)的,所以我们可以直接对每一个循环通过分别求一下其出现次数
求其出现次数当然可以交给\(SAM\)来搞了
于是我们把所有的串都插入\(SAM\)里去,但是我们只计算\(S\)串产生的贡献,对于每一个\(T\)串我们要将其倍长之后再插入,这样我们就可以在\(parent\)树上直接树上倍增求出一个循环同构出现次数了
同时为了去重,我们每次跳出来一个循环同构之后给它打上标记,之后就不要再跳了
这样的做法当让是喜提\(MLE\)
于是我们甚至可以直接那\(map\)来存边,之后不用树上倍增直接暴力往上跳,于是就能以全luogu最慢的好成绩通过这道题
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#define maxn 6000005
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
std::map<int,int> son[maxn];
struct E{int v,nxt;}e[maxn];
int n,lst=1,cnt=1,num,m;
int len[maxn],head[maxn],sz[maxn],deep[maxn],vis[maxn],fa[maxn];
inline void add(int x,int y) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;}
void dfs(int x) {for(re int i=head[x];i;i=e[i].nxt) deep[e[i].v]=deep[x]+1,dfs(e[i].v),sz[x]+=sz[e[i].v];}
int st[1000005],top;
std::vector<int> a[100005];
int L[100005];
char S[1000005];
inline void ins(int c,int o,int t)
{
int f=lst,p=++cnt; lst=p;
len[p]=len[f]+1; if(!o) sz[p]=1;
if(o&&t) a[o].push_back(p);
while(f&&!son[f][c]) son[f][c]=p,f=fa[f];
if(!f) {fa[p]=1;return;}
int x=son[f][c];
if(len[f]+1==len[x]) {fa[p]=x;return;}
int y=++cnt;
len[y]=len[f]+1,fa[y]=fa[x],fa[x]=fa[p]=y;
for(std::map<int,int>::iterator it=son[x].begin();it!=son[x].end();it++) son[y].insert(*it);
while(f&&son[f][c]==x) son[f][c]=y,f=fa[f];
}
inline int find(int x,int li) {while(len[fa[x]]>=li) x=fa[x];return x;}
int main()
{
scanf("%s",S+1),n=strlen(S+1);scanf("%d",&m);
for(re int i=1;i<=n;i++) ins(S[i]-'a',0,0);
for(re int i=1;i<=m;i++)
{
scanf("%s",S+1);L[i]=strlen(S+1);lst=1;
for(re int j=1;j<L[i];j++) ins(S[j]-'a',i,0);ins(S[L[i]]-'a',i,1);
for(re int j=1;j<L[i];j++) ins(S[j]-'a',i,1);
}
for(re int i=2;i<=cnt;i++) add(fa[i],i);deep[1]=1;dfs(1);
for(re int i=1;i<=m;i++)
{
int ans=0;top=0;
for(re int j=0;j<a[i].size();j++)
{
int t=find(a[i][j],L[i]);
if(vis[t]) continue;
st[++top]=t;ans+=sz[t];vis[t]=1;
}
printf("%d\n",ans);
for(re int j=1;j<=top;j++) vis[st[j]]=0;
}
return 0;
}
CF235C 【Cyclical Quest】的更多相关文章
- 【CF235C】Cyclical Quest(后缀自动机)
[CF235C]Cyclical Quest(后缀自动机) 题面 洛谷 题解 大致翻译: 给定一个串 然后若干组询问 每次也给定一个串 这个串可以旋转(就是把最后一位丢到最前面这样子) 问这个串以及其 ...
- 【Codeforces235C】Cyclical Quest 后缀自动机
C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard i ...
- 【学习笔记】浅析后缀自动机(SAM)及基础应用
解决子串相关问题的强大工具 我们知道一个长度为 \(n\) 的字符串中所有的子串数目为 \(O(n^2)\) 个,这很大程度上限制了我们对某些子串相关问题的研究.所以有没有解决方案,使得我们可以在可承 ...
- 【已转移】【Java架构:基础技术】一篇文章搞掂:Spring
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文是对<SPRING实战第4版>的总结,大家也可以去仔细研读该书 [------------------------ ...
- 【AR实验室】mulberryAR : ORBSLAM2+VVSION
本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...
- 【.net 深呼吸】细说CodeDom(1):结构大观
CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 【前端性能】高性能滚动 scroll 及页面渲染优化
最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
随机推荐
- VUE--mixins的一些理解。
概念:混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 用法: 1.创建混 ...
- http和web缓存
1.http的缓存类型 缓 存对于一个网站来说非常重要,可以提高网站性能,减少冗余的数据传输,增加服务器负担,web存储则给浏览器提供了更加强大的保存文件的接口.关于web下的http缓存类型比较 ...
- C#下查找并杀死子进程(进程树)
参考:如何杀死进程及子进程 /** * 传入参数:父进程id * 功能:根据父进程id,杀死与之相关的进程树 */ public static void KillProcessAndChildren( ...
- 白话SpringCloud | 第五章:服务容错保护(Hystrix)
前言 前一章节,我们知道了如何利用RestTemplate+Ribbon和Feign的方式进行服务的调用.在微服务架构中,一个服务可能会调用很多的其他微服务应用,虽然做了多集群部署,但可能还会存在诸如 ...
- ubuntu下安装MySQL8.0
为了一劳永逸不每次都到处找资料,花了一下午时间做了这些.其中大部分是根据官方手册来的,后面部分谢谢大佬的帮助,超开心. 一.首先,将MySQL APT存储库添加到系统的软件存储库列表中 1.转到htt ...
- Jquery系列:设置div、span等dom结点的内容,jquery中没有innerText、innerHtml
发现如果我在div或者其他非表单的标签中赋值,原本用普通的js就直接document.getElementById("id").innerHtml(或者其他几个)就可以了. 但是在 ...
- win10下MySQL 5.7.20解压版安装步骤
1.从官网下载MySQL5.7.20解压版64位:https://dev.mysql.com/downloads/file/?id=473309. 2.解压(我的解压路径为:E:\mysql-5.7. ...
- cocoapods的安装和安装过程中遇到的问题
查看当前的ruby版本,我的版本是ruby 2.0.0p648 小于2.2安装cocoapods时会遇到以下问题 $ ruby -v 查看当前ruby源,默认为 https://rubygems.or ...
- 关于 C# 中接口的一些小结
< 关于 C# 中“接口”的一些小结 > 对于 C# 这样的不支持多重继承的语言,很好的体现的层次性,但是有些时候多重继承的确有一些用武之地. 比如,在 Stream 类 . 图形设备 ...
- Set up ruby debugging environment
Today I finally got ruby debugging working in Eclipse. Below are the major setup steps involved, as ...