又开始划了

我要专心的学文化课去!!!退役就要有点退役的样子!!!2024之前我再也不回来了!!!我现在的行为就是在毁掉自己的青春!!!……

我反悔!

当我无意(其实是有意的)发现SAM这个东西居然时间和空间都是线性的时候,我就知道完了,我又跳坑了……

所以我仔细的研究了一下相关引理和parent树,发现没有看懂建树为什么可以取代endpos来和len一起描述子串。“找到这个点子树中的所有叶子”听上去还有点玄学……

吐槽OIwiki上的“艺术字格式”挂掉了导致我理解endpos是啥都看了半天……最后他在洛谷上的版就没事。

鹤了一遍板子完全不知道是啥很有可能抄错了千万别用,就存个档而已。

今天省选联测5又搬了  

多校noi前集训模拟第十六场(距国赛仅有16天)

这场考试,3个T都一模一样。

code

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn = 1e4 + 3;

struct SAM 
{
    int cnt = 1, las = 1;
    void add(int c)
    {
        int fa = las, now = las = ++cnt;
        d[now].len = d[fa].len + 1;
        f[now] = 1;
        for(; fa&&!d[fa].ch[c]; fa=d[fa].fa) d[fa].ch[c] = now;
        if(!fa) d[now].fa = 1;
        else 
        {
            int j = d[fa].ch[c];
            if(d[j].len == d[fa].len + 1) d[now].fa = j;
            else 
            {
                int clone = ++cnt;
                d[clone] = d[j];
                d[clone].len = d[fa].len + 1;
                d[j].fa = d[now].fa = clone;
                for(; fa&&d[fa].ch[c]==j; fa=d[fa].fa) d[fa].ch[c] = clone;
            }
        }
    }
}sam;

int main()
{
    scanf("%s", s+1);
    int n = strlen(s+1);
    for(int i=1; i<=n; i++)
    {
        sam.add(s[i]-'a'+1);
    }

    return 0;
}

 

posted @ 2022-12-21 13:16  Catherine_leah  阅读(82)  评论(0)    收藏  举报
/* */