題意
分析這個題目還是很優秀的。sigma(len(ti)+len(tj))的值是一定的=n*(n+1)*(n-1)/2。那麼關鍵就是求任意兩個字尾的lcp的和了。
我們怎麼求兩個字尾的lcp?如果用字尾自動機的話,我們可以先把字串反過來,然後建字尾自動機,那麼兩個字尾的lcp就是他們兩個在parent樹上的最近公共祖先(lca)的len。我們要求的是任意兩個字尾的lcp的和,我們可以考慮在parent上跑樹形dp。令dp[u]為以u為lca的lcp的和。
1 #include 2 #include 3 #include 4 #include 5view code6using
namespace
std;
7 typedef long
long
ll;8
const
int maxn=500000+100;9
intn;
10char
s[maxn];
11struct
statest[2*maxn];
15int
last,cur,sz;
16int c[2*maxn],cnt[2*maxn];
17 ll dp[2*maxn];
18void
init()
24void build_sam(int
c)47
}48 last=cur;49}
50int cmp(int a,int
b)53
intmain()68}
6970 ll ans=(ll)n*(n+1)*(n-1)/2;71
for(int i=0;i)
74 printf("
%lld\n
",ans);
7576
return0;
77 }
BZOJ3238 差異(字尾自動機)
bzoj 前面的東西直接暴力算就行了 其實沒必要算的正正好 為了方便的後面的計算 我們不考慮i,j 的順序問題 也就是先求出 n i 1 nj 1 i j len i 然後對於每個字尾樹上的節點,減去一下貢獻 也就是siz e i si ze i 1 le n i len i.p aren t 這樣...
BZOJ3238 差異(字尾自動機)
bzoj 前面的東西直接暴力算就行了 其實沒必要算的正正好 為了方便的後面的計算 我們不考慮 i,j 的順序問題 也就是先求出 sum n sum n i neq j len i 然後對於每個字尾樹上的節點,減去一下貢獻 也就是 size i size i 1 len i len i.parent ...
bzoj3238 差異 字尾樹
題目大意 給你乙個字串 s 設 s i 是串 s 第 i 長的字尾,求 sum limits sum limits s i s j 2 times lcp s i,s j 其中 lcp x,y 表示字串 x 和字串 y 的最長公共字首 資料範圍 s 500000 最近發現字尾樹和 sam 沒學好,找...