题意:给一个主串和多个询问串,求询问串的所有样子不同的周期同构出现次数和


没有周期同构很简单就是询问串出现次数,|Right|

有了周期同构,就是所有循环,把询问串复制一遍贴到后面啊!思想和POJ1509相似,不要局限于复制主串

然后走的时候维护nowLen

需要支持尾部插入字符(走转移边)和首部删除字符(走parent边)就行了

PS:家里上CF太慢了还是学校网速快

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. using namespace std;
  7. #define lc x<<1
  8. #define rc x<<1|1
  9. #define mid ((l+r)>>1)
  10. #define lson lc,l,mid
  11. #define rson rc,mid+1,r
  12. const int N=2e6+;
  13. typedef long long ll;
  14. int n,ri[N];
  15. char s[N];
  16. struct node{
  17. int ch[],par,val;
  18. }t[N];
  19. int sz=,root=,last=;
  20. void extend(int c){
  21. int p=last,np=++sz;
  22. t[np].val=t[p].val+; ri[np]++;
  23. for(;p&&!t[p].ch[c];p=t[p].par) t[p].ch[c]=np;
  24. if(!p) t[np].par=root;
  25. else{
  26. int q=t[p].ch[c];
  27. if(t[q].val==t[p].val+) t[np].par=q;
  28. else{
  29. int nq=++sz;
  30. t[nq]=t[q];t[nq].val=t[p].val+;
  31. t[q].par=t[np].par=nq;
  32. for(;p&&t[p].ch[c]==q;p=t[p].par) t[p].ch[c]=nq;
  33. }
  34. }
  35. last=np;
  36. }
  37. int vis[N];
  38. void walk(int id){//puts("walk");
  39. int u=root,len=n+n-,ans=,nowLen=;
  40. for(int i=;i<=len;i++){
  41. int c=s[i]-'a';
  42. if(t[u].ch[c]) u=t[u].ch[c],nowLen++;
  43. else{
  44. while(u&&!t[u].ch[c]) u=t[u].par;
  45. if(!u) u=root,nowLen=;
  46. else nowLen=t[u].val+,u=t[u].ch[c];
  47. }
  48. //printf("i %d %d %d %d\n",i,c,u,nowLen);
  49. if(vis[u]!=id&&nowLen>=n) vis[u]=id,ans+=ri[u];//,printf("ans %d %d\n",u,ri[u]);
  50. if(n!=) while(t[t[u].par].val+>=n) u=t[u].par,nowLen=t[u].val;
  51. //printf("nowu %d\n",u);
  52. }
  53. printf("%d\n",ans);
  54. }
  55. int c[N],a[N];
  56. void RadixSort(){
  57. for(int i=;i<=sz;i++) c[t[i].val]++;
  58. for(int i=;i<=n;i++) c[i]+=c[i-];
  59. for(int i=sz;i>=;i--) a[c[t[i].val]--]=i;
  60. }
  61. void solve(){
  62. RadixSort();
  63. int u;
  64. for(int i=sz;i>=;i--) u=a[i],ri[t[u].par]+=ri[u];
  65. int m;scanf("%d",&m);
  66. for(int i=;i<=m;i++){
  67. scanf("%s",s+);
  68. n=strlen(s+);
  69. for(int i=;i<n;i++) s[i+n]=s[i];
  70. walk(i);
  71. }
  72. }
  73. int main(){
  74. //freopen("in","r",stdin);
  75. scanf("%s",s+);
  76. n=strlen(s+);
  77. for(int i=;i<=n;i++) extend(s[i]-'a');
  78. solve();
  79. }

CF 235C. Cyclical Quest [后缀自动机]的更多相关文章

  1. Codeforces 235C Cyclical Quest - 后缀自动机

    Some days ago, WJMZBMR learned how to answer the query "how many times does a string x occur in ...

  2. 【Codeforces235C】Cyclical Quest 后缀自动机

    C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard i ...

  3. 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 ...

  4. CF 149E Martian Strings 后缀自动机

    这里给出来一个后缀自动机的题解. 考虑对 $s$ 的正串和反串分别建后缀自动机. 对于正串的每个节点维护 $endpos$ 的最小值. 对于反串的每个节点维护 $endpos$ 的最大值. 这两个东西 ...

  5. CodeForces 235C Cyclical Quest(后缀自动机)

    [题目链接] http://codeforces.com/contest/235/problem/C [题目大意] 给出一个字符串,给出一些子串,问每个子串分别在母串中圆环匹配的次数,圆环匹配的意思是 ...

  6. Codeforces 235C. Cyclical Quest

    传送门 写的时候挺蛋疼的. 刚开始的时候思路没跑偏,无非就是建个SAM然后把串开两倍然后在SAM上跑完后统计贡献.但是卡在第二个样例上就是没考虑相同的情况. 然后开始乱搞,发现会出现相同串的只有可能是 ...

  7. Codeforces 235C Cyclical Quest 字符串 SAM KMP

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF235C.html 题目传送门 -  CF235C 题意 给定一个字符串 $s$ ,多组询问,每组询问的形式为 ...

  8. 后缀自动机(SAM)

    *在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...

  9. 【学习笔记】浅析后缀自动机(SAM)及基础应用

    解决子串相关问题的强大工具 我们知道一个长度为 \(n\) 的字符串中所有的子串数目为 \(O(n^2)\) 个,这很大程度上限制了我们对某些子串相关问题的研究.所以有没有解决方案,使得我们可以在可承 ...

随机推荐

  1. Linux使用Public Key方式远程登录

    一.前言: ssh远程登录密码认证的方式有三种,password.Keyboard Interactive.Public Key 前面两种方式就是密码认证,含义都是一样大同小异.第三种是登录方式最安全 ...

  2. Spring配置集群定时任务

    正常配置定时任务的时候配置定时任务调度工厂的代码如下 <bean id="" class="org.springframework.scheduling.quart ...

  3. [OpenCV学习笔记2][Mat数据类型和操作]

    [Mat数据类型和基本操作] ®.运行环境:Linux(RedHat+OpenCV3.0) 1.Mat的作用: Mat类用于表示一个多维的单通道或者多通道的稠密数组.能够用来保存实数或复数的向量.矩阵 ...

  4. python对象的基本操作代码

    基础: #对象.方法() # a=1 # b=a # a=2 # # _a=2423 # # print(a) # print(b) # # print(False and False) # prin ...

  5. 织梦dedeCMS留言薄

    dedeCMS留言薄模塊名爲guestbook, 留言薄模板:/templets/plus/guestbook.htm; 留言回覆模板: 管理員回覆調用/templets/plus/guestbook ...

  6. P2P结构与Quorum机制------《Designing Data-Intensive Applications》读书笔记8

    前文涉及到了很多与Leader相关的算法,大家有木有想过,王侯将相,宁有种乎,既然Leader这么麻烦,干脆还是采用P2P模型吧,来个大家平等的架构.本篇需要和大家探讨的就是多副本下实现民主政治的Qu ...

  7. J.U.C ThreadPoolExecutor解析

    Java里面线程池顶级接口是Executor,但严格意义上讲Executor并不是一个线程池,而是一个线程执行工具,真正的线程池接口是ExecutorService.关系类图如下: 首先Executo ...

  8. CCF系列之日期计算(201509-2)

    试题编号: 201509-2 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年的2月有29天.满足下面条件之一的是闰年: ...

  9. I like NetWorld

    liangfengbo.com ibobobo.com https.net.cn bobobo.com.cn scode.net scode.cc liangbolin.com linhe.cc li ...

  10. Hystrix-异常处理

    异常的传播和捕获 传播:在HystrixCommand实现的run()方法中跑出异常时,除了HystrixBadRequestException之外,其他异常均会被Hystrix认为命令执行失败并处罚 ...