bzoj1396識別子串(SAM 線段樹)

2022-05-05 12:42:13 字數 991 閱讀 7585

複習sam板子啦!考前刷水有益身心健康當然這不是板子題/水題……

很容易發現只在i位置出現的串一定是個字首串。那麼對答案的貢獻分成兩部分:一部分是len[x]-fa~len[x]的這部分貢獻會是r-l+1;剩下一部分1~len-fa-1這部分會和i~r構成答案,寫兩棵線段樹即可。

然後就又是板子題了,兩個板子(sam+線段樹)套起來。

#include#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

using

namespace

std;

const

int n=2e5+7,inf=0x3f3f3f3f

;int n,lst=1,rt=1,cnt=1,ch[n][26

],len[n],fa[n],sz[n];

char

s[n];

struct

tree

void pushdown(int

rt)

void update(int l,int r,int v,int l,int r,int

rt)

int mid=l+r>>1

;pushdown(rt);

if(l<=mid)update(l,r,v,lson);

if(r>mid)update(l,r,v,rson);

}int query(int k,int l,int r,int

rt)

}tr1,tr2;

void build(int

c) }

lst=np;

}int

main()

for(int i=1;i<=n;i++)printf("

%d\n

",min(tr1.query(i,1,n,1)-i,tr2.query(i,1,n,1

)));

}

view code

BZOJ1396 識別子串 SAM 線段樹

題目鏈結 題意 給定乙個字串s,對於乙個整數k,定義s的子串t s i,j 是關於第k位的識別子串,滿足以下兩個條件 1 i k j。2 子串t只在s中出現過一次。例如,s banana k 5,則關於第k位的識別子串有 nana anan anana nan banan 和 banana 現在,給...

BZOJ 1396 識別子串

solution 我得了 能用字尾陣列就一定不用字尾自動機綜合症 感覺用height rank sa 處理字串真的好優雅 雖然其他題上字尾陣列常數比較大 不過這個字尾陣列水了一發似乎就rank1 了 開心 題解就是求出字尾陣列以後維護乙個單調佇列來更新答案啦。include include incl...

Bzoj1396 識別子串

i 1,n i 1,n 求包含 i i 並且在原串 s role presentation style position relative s s中只出現一次的子串的最短長度 因為每個點pa rent p ar en t樹上的父親肯定是當前節點所代表的串的字尾 那麼只出現一次的串就是pa rent ...