【笔记】Tricks - 后缀自动机 SAM

  1. 因为由 endpos 带来的很多美妙的性质,可以考虑枚举 sam 上的状态。

  2. 匹配类的问题,可以考虑像 acam 一样跳 link(fail)链。

  3. 对于一个串,可以找到她所有前缀的在 sam 上面的的最大的 len。【[BJOI2020] 封印】【CF666E Forensic Examination
    具体做法是动态维护当前前缀在 sam 上面的点。(f 是最长的 len

    cur = sam.rt;
    for (int i = 1; i <= n; i++) {
    	char ch = s[i]-'a';
    	if (sam[cur].nxt[ch]) f[i] = f[i-1]+1, cur = sam[cur].nxt[ch];
    	//!上面这个 if 也不能省,因为如果直接用 cur 的 len 更新的话,不能确保是合法的。
    	else {
    		while (cur && !sam[cur].nxt[ch]) cur = sam[cur].link;
    		if (!cur) cur = sam.rt;
    		else f[i] = sam[cur].len+1, cur = sam[cur].nxt[ch];
    		// else cur = sam[cur].nxt[ch], f[i] = sam[cur].len;
    		//!这样是不行的,因为我们只保证的从 rt 到 cur 的 len 是合法的,但不一定走了转移边之后也合法。
    	}
    }
    
posted @ 2024-05-01 18:57  CloudWings  阅读(14)  评论(0编辑  收藏  举报