经典题

注意匹配的时候:用t串去s串的SAM里进行匹配,和字典树一样遍历t中字符,用cur记录当前已经匹配的长度,如果能当前字符能匹配则cur++(这里不能直接用cur=len[now]),反之用link指针进行失配,直到完成匹配后cur=len[now]

为什么匹配成功时不能直接cur=len[now]?因为自动机上的转移是在后面加一个字符,但是不保证前面不加字符,因为每个结点的len是该节点代表的maxlen

但是失配后再转移成功则可以用cur=len[now],因为失配结点代表的最短串长度都有len[now]+1,即到了这个状态,那么t串一定有minlen[now]的长度,所以其link指向的状态的maxlen[now]=minlen[now-1]一定是满足条件的!

#include<bits/stdc++.h>
using namespace std;
#define maxn 250005
struct SAM{
int cnt,last;
int nxt[maxn<<][];
int link[maxn<<];
int len[maxn<<];
SAM(){
cnt=last=;
}
void insert(int c){
int p=last,np=last=++cnt;
len[np]=len[p]+; for(;p&&!nxt[p][c];p=link[p])
nxt[p][c]=np;
if(!p){link[np]=;return;} int q=nxt[p][c];
if(len[q]==len[p]+){link[np]=q;return;} int clone=++cnt;
link[clone]=link[q];
len[clone]=len[p]+;
memcpy(nxt[clone],nxt[q],sizeof nxt[q]);
link[q]=link[np]=clone;
for(;p&&nxt[p][c]==q;p=link[p])
nxt[p][c]=clone;
}
int query(char *s){
int now=,Len=strlen(s),cur=,Max=;
for(int i=;i<Len;i++){
int c=s[i]-'a';
if(nxt[now][c]){
now=nxt[now][c];
cur++;
}
else {
while(now && !nxt[now][c])now=link[now];
if(now){
cur=len[now]+;
now=nxt[now][c];
}
else {
now=;
cur=;
}
}
Max=max(Max,cur);
}
return Max;
}
}p;
char s[maxn],t[maxn]; int main(){
scanf("%s%s",s,t);
int len1=strlen(s);
int len2=strlen(t);
for(int i=;i<len1;i++)
p.insert(s[i]-'a');
cout<<p.query(t)<<endl;
}

最新文章

  1. 读取jar包资源(转)
  2. Learn sed using these command on Linux(流线式编辑器——sed)
  3. 【HDOJ】2822 Dogs
  4. python-整理-面向对象
  5. c++中,size_typt, size_t, ptrdiff_t 简介
  6. SQL点滴12—SQL Server备份还原数据库中的小把戏
  7. jquery ajax 请求中多出现一次OPTIONS请求及其解决办法
  8. windows下virtualenv中安装MySQL-python
  9. 5--Postman上传文件
  10. 五款实用免费的Python机器学习集成开发环境(5 free Python IDE for Machine Learning)(图文详解)
  11. 企业库实现AOP的几种方法
  12. 20155303 2016-2017-2 《Java程序设计》第六周学习总结
  13. 度限制最小生成树 POJ 1639 贪心+DFS+prim
  14. swift - 移除界面上的所有元素
  15. python2.0_day21_bbs系统评论自动加载+文章创建
  16. hdu 5111 树链剖分加函数式线段树
  17. tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数
  18. mongoDb数据库可视化工具 --- Robo
  19. 驱动之LCD的介绍与应用20170209
  20. Linux Supervisor的安装与使用入门---Ubuntun

热门文章

  1. web.xml中配置——加载spring容器
  2. git命令的基本使用
  3. js获取url参数值的几种方式
  4. 【JZOJ6434】【luoguP5665】【CSP-S2019】划分
  5. PHP ftp_nlist() 函数
  6. Java中连接MySql数据库的例子
  7. python内置模块-random
  8. 第一个脚本 &quot;Hello World!&quot;
  9. 使用ansible远程管理集群
  10. VS下使用VIM, Visual Studio 安装 VSvim插件 配置 及使用