time limit: 10 sec memory limit: 162 mb
submit: 240 solved: 148
[submit][status][discuss]
一行,乙個由小寫字母組成的字串s,長度不超過10^5
l行,每行乙個整數,第i行的資料表示關於s的第i個元素的最短識別子串有多長.
agoodcookcooksgoodfood12
3322
3322
3321
2332
1234
據說因為sam是一棵逆序的字尾樹,那麼每一位i的字首(除了包含在別的字首裡面)所對應的節點一定是字尾樹里的葉子節點。那麼我們只要找到它的父親節點,然後它的父親節點對應的子串填上一位字元就是乙個識別子串。具體膜拜這個部落格:我還是太弱了。
1 #include2 #include3 #include4view code#define inf 1<<30
5#define maxn 100005
6using
namespace
std;
7intn;8
char
s[maxn];
9struct
sam13
int newnode(int x)
14void extend(int
x)27
}28 last=np;29}
30}sam;
31structt34
void add(int z,int l,int r,int x,int y,int
w)37
int mid=(l+r)>>1
;38 add(z*2,l,mid,x,y,w); add(z*2+1,mid+1
,r,x,y,w);39}
40int query(int z,int l,int r,int
x)46
}f,t;
47int
main()
57for(int i=1;i<=n;i++) printf("
%d\n
",min(f.query(1,1,n,i),t.query(1,1,n,i)-i+1
));58
return0;
59 }
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 ...
BZOJ1396 識別子串
列舉左端點 i 那麼可行的右端點 j 的最小值單調不下降,可以通過雙指標求出,檢驗可以通過在字尾陣列裡檢查相鄰height值做到 o 1 那麼左端點為 i 右端點在 j,n 它對前面一段的貢獻為定值,對後面一段的貢獻為等差數列,線段樹維護即可。時間複雜度 o n log n include incl...