这道题直接看代码吧。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int maxn=2000010;
 6 int fa[maxn],len[maxn],rit[maxn],w[maxn],sa[maxn];
 7 int n,Q,cnt,lst,ch[maxn][26],vis[maxn];
 8 char s[maxn];
 9 struct SAM{
10     SAM(){
11         memset(fa,0,sizeof(fa));
12         memset(len,0,sizeof(len));
13         memset(rit,0,sizeof(rit));
14         cnt=lst=1;
15     }
16
17     void Insert(int c){
18         int p=lst,np=lst=++cnt;len[np]=len[p]+1;
19         while(p&&!ch[p][c])ch[p][c]=np,p=fa[p];
20         if(!p)fa[np]=1;
21         else{
22             int q=ch[p][c];
23             if(len[p]+1==len[q])fa[np]=q;
24             else{
25                 int nq=++cnt;len[nq]=len[p]+1;
26                 memcpy(ch[nq],ch[q],sizeof(ch[q]));
27                 fa[nq]=fa[q];fa[q]=fa[np]=nq;
28                 while(ch[p][c]==q)ch[p][c]=nq,p=fa[p];
29             }
30         }
31     }
32
33     void Prepare(){
34         //rit[1]=1;
35         for(int i=1,p=1;i<=n;i++)
36             rit[p=ch[p][s[i]-'a']]+=1;
37         for(int i=1;i<=cnt;i++)w[len[i]]+=1;
38         for(int i=1;i<=cnt;i++)w[i]+=w[i-1];
39         for(int i=1;i<=cnt;i++)sa[--w[len[i]]]=i;
40         for(int i=cnt;i;i--)rit[fa[sa[i]]]+=rit[sa[i]];
41     }
42
43     void Solve(int tim){
44         scanf("%s",s+1);n=strlen(s+1);
45         for(int i=1;i<=n;i++)s[n+i]=s[i];
46         int p=1,ans=0,l=0;
47         for(int i=1,c;i<2*n;i++){
48             c=s[i]-'a';
49             while(p!=1&&!ch[p][c])
50                 {p=fa[p];l=len[p];}
51             if(!ch[p][c])l=0;
52             else{p=ch[p][c];l+=1;}
53
54             if(l>=n){
55                 while(len[fa[p]]>=n)p=fa[p],l=len[p];
56                 if(vis[p]!=tim)vis[p]=tim,ans+=rit[p];
57             }
58         }
59         printf("%d\n",ans);
60     }
61 }sam;
62 int main(){
63     freopen("rotate.in","r",stdin);
64     freopen("rotate.out","w",stdout);
65     scanf("%s%d",s+1,&Q);n=strlen(s+1);
66     for(int i=1;i<=n;i++)sam.Insert(s[i]-'a');
67     sam.Prepare();while(Q--)sam.Solve(Q+1);
68     return 0;
69 }

转载于:https://www.cnblogs.com/TenderRun/p/5697265.html

字符串(后缀自动机):COGS 2399. 循环同构相关推荐

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

    题意:给一个主串,再给出多个模式串,分别求主串中有多少个连续子串,与模式串循环同构. 题解:后缀自动机 因为要求循环同构,所以将模式串复制放到后面.(要么加终止符,要么传入长度) 先对主串建sam,然 ...

  2. 字符串循环同构的最小表示法(转)

    循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S'中字典序最小的一个. 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S'是S的循环同构的串 ...

  3. 【BZOJ-13962865】识别子串字符串识别 后缀自动机/后缀树组 + 线段树

    1396: 识别子串 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 312  Solved: 193 [Submit][Status][Discus ...

  4. 【雅礼集训2017】字符串【后缀自动机】【数据分治】

    题意:给定一个字符串SSS和mmm个区间[li,ri][l_i,r_i][li​,ri​],qqq次询问,每次给定长度为kkk的字符串www和区间[a,b][a,b][a,b],求对于所有i∈[a,b ...

  5. [十二省联考2019]字符串问题 后缀自动机 + 拓扑排序 + 最长路 + 倍增

    题目描述: 给定一个长串 $S$,给定若干 $S$ 的子串 $a_{i}$, $b_{i}$,再给出一些 $a$ 串和 $b$ 串的支配关系. 构造一个长度最长的字符串,使得: 字符串只由 $a_{i ...

  6. 51nod 1292 字符串中的最大值V2(后缀自动机)

    题意: 有一个字符串T.字符串S的F函数值可以如下计算:F(S) = L * S在T中出现的次数(L为字符串S的长度).求所有T的子串S中,函数F(S)的最大值. 题解: 求T的后缀自动机,然后所有每 ...

  7. 【算法竞赛学习笔记】后缀自动机SAM-超经典的字符串问题详解

    title : 后缀自动机 date : 2021-11-11 tags : ACM,字符串 author : Linno 前置知识 KMP,Trie,AC自动机等字符串基础 DFA(有限状态自动机) ...

  8. 最长公共子串_两个字符串的最长公共子串(后缀自动机)

    // 最长公共子序列(后缀自动机) typedef struct state {int len, link;map<char, int> next; }state;const int MA ...

  9. [学习笔记]后缀自动机

    解决大部分字符串问题的大杀器 给一下clj课件:戳我 SAM是一个博大精深的算法.虽然没有像网络流家族,Tarjan家族一样拉帮结派,但是自身包含很多方法. 一.前言 字符串常见问题:各种匹配 1.L ...

  10. hihocoder 1465 : 后缀自动机五·重复旋律8(后缀自动机+最长公共子串)

    1465 : 后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的 ...

最新文章

  1. 使用参数化化模型投影点云
  2. Hadoop应用实战100讲(二)-Hadoop常用命令汇总
  3. 六、 跨多个WebService管理Session
  4. Prepare for Mac App Store Submission--为提交到Mac 应用商店做准备
  5. 我的nginx iis 负载均衡学习(环境搭建)
  6. linux终端命令行用户名和密码,Linux入门篇 —— Linux 用户与组管理详解(system-config-users 命令行)| 七日打卡...
  7. 学习Jsoup(一)
  8. Swift - as、as!、as?三种类型转换操作使用一览
  9. apache 配置用户级目录
  10. CTFHub 备份文件下载
  11. 系列个人网站上线一周年总结
  12. java tld 方法重载_java 中的TLD文件
  13. Java自学路线总结
  14. k8s 的容器command用法相关
  15. 关于ant design pro中2个下拉列表,下列列表a的数据需要依据列表b选择的值来进行变化,无法及时获取
  16. 以太坊加密猫Crypto Kitty合约解析
  17. 华中师范大学计算机学院学分绩,华中师范大学学生学业成绩表(模板)
  18. Python中的base64、base32实例
  19. java与JSON语法及解析
  20. Ethereum 基础(一)

热门文章

  1. C# Windows异步I/O操作
  2. Vmware Linux设置固定IP
  3. Effective_STL 学习笔记(四十五) 注意 count、find、binary_search、lower_bound、upper_bound 和 equal_range 的区别...
  4. windows系统查看80端口被占用的程序并结束该程序运行
  5. RAC 特点   character
  6. linux下目录与文件的权限及特殊权限
  7. ios之alloc和init
  8. Cisco公司的CAR流量控制策略
  9. [小技巧]为Atlas AutoComplete加上滚动条
  10. 我常用的15 款开发工具!