SAM板子

function newnode(x:longint):longint;
begin
  inc(cnt);dis[cnt]:=x;exit(cnt);
end;

procedure add(id:longint);
var ch,i:char;p,np,q,nq,j:longint;
begin
  ch:=s[id];np:=newnode(id);p:=last;last:=np;
  while(p>0)and(t[p].son[ch]=0)do
  begin
    t[p].son[ch]:=np;p:=t[p].fa;
  end;
  if p=0 then t[np].fa:=root else
  begin
    q:=t[p].son[ch];
    if dis[q]=dis[p]+1 then t[np].fa:=q else
    begin
      nq:=newnode(dis[p]+1);
      for i:=‘a‘ to ‘z‘ do t[nq].son[i]:=t[q].son[i];
      t[nq].fa:=t[q].fa;
      t[q].fa:=nq;t[np].fa:=nq;
      while t[p].son[ch]=q do
      begin
        t[p].son[ch]:=nq;p:=t[p].fa;
      end;
    end;
  end;
end;

procedure build;
var i,len:longint;
begin
  readln(s);len:=length(s);
  cnt:=1;root:=1;last:=1;
  for i:=1 to len do add(i);
  for i:=1 to cnt do inc(sum[dis[i]]);
  for i:=1 to len do inc(sum[i],sum[i-1]);
  for i:=cnt downto 1 do
  begin
    tmp[sum[dis[i]]]:=i;dec(sum[dis[i]]);
  end;
end;
时间: 2024-08-28 08:46:03

SAM板子的相关文章

后缀自动机 模板

SAM板子,没什么好说的 建出来SAM然后跑个DFS统计答案就行了 1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define ll long long 6 #define N 3010 7 #define rint register int 8 #define il inline 9 #define idx(x) (x-'a'+1)

cf1121F. Compress String(后缀自动机)

题意 题目链接 Sol 居然出个SAM板子也是没谁了233 #include<bits/stdc++.h> #define Pair pair<int, int> #define MP(x, y) make_pair(x, y) #define fi first #define se second //#define int long long #define LL long long #define Fin(x) {freopen(#x".in","

后缀自己主动机(SAM)学习指南

*在学习后缀自己主动机之前须要熟练掌握WA自己主动机.RE自己主动机与TLE自己主动机* 什么是后缀自己主动机 后缀自己主动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造.可以接受一个字符串全部后缀的自己主动机. 它最早在陈立杰的 2012 年 noi 冬令营讲稿中提到. 在2013年的一场多校联合训练中,陈立杰出的 hdu 4622 能够用 SAM 轻松水过.由此 SAM 流行了起来. 一般来说.能用后缀自己主动机解决的问题都能够用后缀数组解决.可是后缀自己

后缀自动机(SAM)

*在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符串所有后缀的自动机. 它最早在陈立杰的 2012 年 noi 冬令营讲稿中提到. 在2013年的一场多校联合训练中,陈立杰出的 hdu 4622 可以用 SAM 轻松水过,由此 SAM 流行了起来. 一般来说,能用后缀自动机解决的问题都可以用后缀数组解决.但是后缀自动机也拥有自己的优点. 1812.

板子们~

要省选啦!码码板子…… const int N = 200010; char st[N]; int rk[N], sa[N], nr[N], ns[N], tab[N], hi[N]; void calc(int n) { for (int i = 0; i <= 26; ++ i) tab[i] = 0; for (int i = 1; i <= n; ++ i) tab[st[i] - 'a' + 1] = 1; for (int i = 1; i <= 26; ++ i) tab[

[bzoj2806][Ctsc2012]Cheat(后缀自动机(SAM)+二分答案+单调队列优化dp)

偷懒直接把bzoj的网页内容ctrlcv过来了 2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1943  Solved: 1004[Submit][Status][Discuss] Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的01串,表示N篇作文 Output N行,每行一个整数,表示这篇作文的Lo

CF452E Three strings【广义SAM】

传送门 也是广义 SAM 的板子题,建好广义 SAM,统计 \(epA,epB,epC\),然后对于区间 \(ans[len[fa[x]]+1],...,ans[len[x]]\) 加上 \(epA\times epB\times epC\) 就行了,当然这个用差分实现简单快捷. #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=3e5+10; const int mod=1e9+7;

sam 文件的解释

高通两数据测序之后要map到基因组上,我通常用bwa bowtie和tophat .其实我知道sam 文件有好几个field,每个field代表不同的意思,但是由于各种格式的文件确实太多了,我也记不住每个field具体的意思.每次要用的时候都是上网再去找,或者把相关的资料下载下来,再现学. 今天,我和一个同学讨论我们数据的情况.他们都是用bowtie 去map 的,我之前写了个脚本,是用bwa 做的map,我有点懒散,也懒得再去修改了,于是也没想着要再写一个用bowtie 做map的脚本.与同学

Arduino 板子 COM 接口找不到设备

复位 Arduino 板子 1.打开官方的blink程序. 2.重新拔插usb. 3.点下载. 4.按住左上角的复位按键不放. 5.等显示开始下载瞬间松开按键.把握住那个瞬间. 6.多试验几次看能下载好不.Arduino 板子 COM 接口找不到设备,布布扣,bubuko.com