CF 235C. Cyclical Quest [后缀自动机]
题意:给一个主串和多个询问串,求询问串的所有样子不同的周期同构出现次数和
没有周期同构很简单就是询问串出现次数,|Right|
有了周期同构,就是所有循环,把询问串复制一遍贴到后面啊!思想和POJ1509相似,不要局限于复制主串
然后走的时候维护nowLen
需要支持尾部插入字符(走转移边)和首部删除字符(走parent边)就行了
PS:家里上CF太慢了还是学校网速快
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <cmath>
- using namespace std;
- #define lc x<<1
- #define rc x<<1|1
- #define mid ((l+r)>>1)
- #define lson lc,l,mid
- #define rson rc,mid+1,r
- const int N=2e6+;
- typedef long long ll;
- int n,ri[N];
- char s[N];
- struct node{
- int ch[],par,val;
- }t[N];
- int sz=,root=,last=;
- void extend(int c){
- int p=last,np=++sz;
- t[np].val=t[p].val+; ri[np]++;
- for(;p&&!t[p].ch[c];p=t[p].par) t[p].ch[c]=np;
- if(!p) t[np].par=root;
- else{
- int q=t[p].ch[c];
- if(t[q].val==t[p].val+) t[np].par=q;
- else{
- int nq=++sz;
- t[nq]=t[q];t[nq].val=t[p].val+;
- t[q].par=t[np].par=nq;
- for(;p&&t[p].ch[c]==q;p=t[p].par) t[p].ch[c]=nq;
- }
- }
- last=np;
- }
- int vis[N];
- void walk(int id){//puts("walk");
- int u=root,len=n+n-,ans=,nowLen=;
- for(int i=;i<=len;i++){
- int c=s[i]-'a';
- if(t[u].ch[c]) u=t[u].ch[c],nowLen++;
- else{
- while(u&&!t[u].ch[c]) u=t[u].par;
- if(!u) u=root,nowLen=;
- else nowLen=t[u].val+,u=t[u].ch[c];
- }
- //printf("i %d %d %d %d\n",i,c,u,nowLen);
- if(vis[u]!=id&&nowLen>=n) vis[u]=id,ans+=ri[u];//,printf("ans %d %d\n",u,ri[u]);
- if(n!=) while(t[t[u].par].val+>=n) u=t[u].par,nowLen=t[u].val;
- //printf("nowu %d\n",u);
- }
- printf("%d\n",ans);
- }
- int c[N],a[N];
- void RadixSort(){
- for(int i=;i<=sz;i++) c[t[i].val]++;
- for(int i=;i<=n;i++) c[i]+=c[i-];
- for(int i=sz;i>=;i--) a[c[t[i].val]--]=i;
- }
- void solve(){
- RadixSort();
- int u;
- for(int i=sz;i>=;i--) u=a[i],ri[t[u].par]+=ri[u];
- int m;scanf("%d",&m);
- for(int i=;i<=m;i++){
- scanf("%s",s+);
- n=strlen(s+);
- for(int i=;i<n;i++) s[i+n]=s[i];
- walk(i);
- }
- }
- int main(){
- //freopen("in","r",stdin);
- scanf("%s",s+);
- n=strlen(s+);
- for(int i=;i<=n;i++) extend(s[i]-'a');
- solve();
- }
CF 235C. Cyclical Quest [后缀自动机]的更多相关文章
- Codeforces 235C Cyclical Quest - 后缀自动机
Some days ago, WJMZBMR learned how to answer the query "how many times does a string x occur in ...
- 【Codeforces235C】Cyclical Quest 后缀自动机
C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard i ...
- Codeforces Round #146 (Div. 1) C - Cyclical Quest 后缀自动机+最小循环节
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...
- CF 149E Martian Strings 后缀自动机
这里给出来一个后缀自动机的题解. 考虑对 $s$ 的正串和反串分别建后缀自动机. 对于正串的每个节点维护 $endpos$ 的最小值. 对于反串的每个节点维护 $endpos$ 的最大值. 这两个东西 ...
- CodeForces 235C Cyclical Quest(后缀自动机)
[题目链接] http://codeforces.com/contest/235/problem/C [题目大意] 给出一个字符串,给出一些子串,问每个子串分别在母串中圆环匹配的次数,圆环匹配的意思是 ...
- Codeforces 235C. Cyclical Quest
传送门 写的时候挺蛋疼的. 刚开始的时候思路没跑偏,无非就是建个SAM然后把串开两倍然后在SAM上跑完后统计贡献.但是卡在第二个样例上就是没考虑相同的情况. 然后开始乱搞,发现会出现相同串的只有可能是 ...
- Codeforces 235C Cyclical Quest 字符串 SAM KMP
原文链接https://www.cnblogs.com/zhouzhendong/p/CF235C.html 题目传送门 - CF235C 题意 给定一个字符串 $s$ ,多组询问,每组询问的形式为 ...
- 后缀自动机(SAM)
*在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...
- 【学习笔记】浅析后缀自动机(SAM)及基础应用
解决子串相关问题的强大工具 我们知道一个长度为 \(n\) 的字符串中所有的子串数目为 \(O(n^2)\) 个,这很大程度上限制了我们对某些子串相关问题的研究.所以有没有解决方案,使得我们可以在可承 ...
随机推荐
- Linux使用Public Key方式远程登录
一.前言: ssh远程登录密码认证的方式有三种,password.Keyboard Interactive.Public Key 前面两种方式就是密码认证,含义都是一样大同小异.第三种是登录方式最安全 ...
- Spring配置集群定时任务
正常配置定时任务的时候配置定时任务调度工厂的代码如下 <bean id="" class="org.springframework.scheduling.quart ...
- [OpenCV学习笔记2][Mat数据类型和操作]
[Mat数据类型和基本操作] ®.运行环境:Linux(RedHat+OpenCV3.0) 1.Mat的作用: Mat类用于表示一个多维的单通道或者多通道的稠密数组.能够用来保存实数或复数的向量.矩阵 ...
- python对象的基本操作代码
基础: #对象.方法() # a=1 # b=a # a=2 # # _a=2423 # # print(a) # print(b) # # print(False and False) # prin ...
- 织梦dedeCMS留言薄
dedeCMS留言薄模塊名爲guestbook, 留言薄模板:/templets/plus/guestbook.htm; 留言回覆模板: 管理員回覆調用/templets/plus/guestbook ...
- P2P结构与Quorum机制------《Designing Data-Intensive Applications》读书笔记8
前文涉及到了很多与Leader相关的算法,大家有木有想过,王侯将相,宁有种乎,既然Leader这么麻烦,干脆还是采用P2P模型吧,来个大家平等的架构.本篇需要和大家探讨的就是多副本下实现民主政治的Qu ...
- J.U.C ThreadPoolExecutor解析
Java里面线程池顶级接口是Executor,但严格意义上讲Executor并不是一个线程池,而是一个线程执行工具,真正的线程池接口是ExecutorService.关系类图如下: 首先Executo ...
- CCF系列之日期计算(201509-2)
试题编号: 201509-2 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年的2月有29天.满足下面条件之一的是闰年: ...
- I like NetWorld
liangfengbo.com ibobobo.com https.net.cn bobobo.com.cn scode.net scode.cc liangbolin.com linhe.cc li ...
- Hystrix-异常处理
异常的传播和捕获 传播:在HystrixCommand实现的run()方法中跑出异常时,除了HystrixBadRequestException之外,其他异常均会被Hystrix认为命令执行失败并处罚 ...