寫了一半 沒了啊啊啊 重新寫的
思路:
先不考慮字尾自動機 (我不會啊)
那這道題只能用字尾陣列了
先把原串倒一下 字尾->字首
相當於每回在前面加了乙個字母
求不同的子串個數
首先 正常的求子串個數我們是會的 spoj 705
但是這道題比較坑 它讓你每回都輸出一下
那只好 維護乙個前驅 乙個後繼 求lcp 取max
ans=ans+n-i+1-max(lcp(),lcp())
用set維護前驅和後繼就好啦~
//by siriusren
#include
#include
#include
#include
using namespace std;
const int n=100050;
int n,s[n],sa[n],tsa[n],cnta[n],cntb[n],a[n],b[n],rk[n],ht[n],f[n][20],log[n];
setset;long long ans;
void sa()
for(int i=1,j=0;i<=n;i++)
for(int j=1;j<=19;j++)
for(int i=1;i+(1<
f[i][j]=min(f[i][j-1],f[i+(1<
}int lcp(int x,int y)
int main()
}
BZOJ 4516 字尾自動機
題意 統計本質不同的子串數量。題解 模板題,字尾自動機。在每乙個節點處,統計一下他能代表多少個 以他為終點的串。然後動態建立sam,同時每加一次都輸出一次就行了。唯一的不同是,這個題是int,而不是傳統的字串,那麼把nxt陣列換成map,複雜度多乙個log sizeof nxt 實際上非常小。cod...
BZOJ4516 生成魔咒,字尾陣列 Splay
time 2016.05.28 author xiaoyimi 思路 考場上寫的60分kmp 學過字尾陣列的都知道,乙個串裡不同子串的個數 n sa i heig ht i 對於問題中串每次插入乙個數字,它實際上使長度增加了1,即 n n2 n 1 2,對答案的貢獻是2n 1,注意這裡的n不是總長,...
BZOJ 4516 生成魔咒
串串長度 n 1 05 n leq 10 5 n 10 5,串中元素x 1 09 x leq 10 9 x 10 9,問每加入乙個數後本質不同的子串數 裸的s am samsa m或者是離線sasa sa。這裡討論sasa sa做法。實際上問題就是把整個串翻轉一下 然後就相當於計算完每個串的貢獻以後...