1762 識別子串 string

2021-09-17 01:54:13 字數 1419 閱讀 3236

題意

記憶體限制:128 mib

時間限制:1000 ms

00 題解

考慮建出parent樹,只有葉子結點上所接受的串在原串**現一次,而其最長接受的串為原串的一段字首

所以對於其葉子結點 i

ii 上在原串中對應著 [1,

leni

][1,len_i]

[1,len

i​]~[le

ni−l

enfa

i,le

ni][len_i-len_,len_i]

[leni​

−len

fai​

​,le

ni​]

所以對於 [1,

leni

−len

fai]

[1,len_i-len_]

[1,len

i​−l

enfa

i​​]

的點,可以把 len

ilen_i

leni

​ 作為其右端點,對於 [le

ni−l

enfa

i+1,

leni

][len_i-len_+1,len_i]

[leni​

−len

fai​

​+1,

leni

​]的點,可以把 len

fai+

1len_+1

lenfai

​​+1

作為包含它的區間長度

所以開兩棵線段樹,維護最小右端點和最小長度即可

#include using namespace std;

const int n=2e5+5;

int n,lst=1,sz=1,ans[n];

char s[n];bool g[n];

struct sama[n];

void build(int x)

} lst=np;

}struct t

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

if (mid>=l) update(ls,l,mid,l,r,v);

if (mid=x) return query(ls,l,mid,x,min(v,in[k]));

return query(rs,mid+1,r,x,min(v,in[k]));

}}t[2];

int main()

String按照子串反轉目標串的子串內容

string 類有乙個reverse 方法可以直接反轉整個字串,但並未提供按照自己提供的子串的能進行反轉。我們使用kmp演算法,先找到匹配的最後的乙個下標再進行反轉,再拼接。一 public static string reverse string s,string t else k i int m...

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 ...