洛谷P6292 區間本質不同子串個數

2021-10-14 10:23:31 字數 1763 閱讀 7750

傳送門 to luogu

首先看一眼標籤啊,字尾自動機?懂了,詢問按照右端點排序

再想想這個題啊,對於固定右端點,左端點在乙個區間內很有可能有規律的變換。肯定是用資料結構維護唄。

現在只看右端點的移動帶來的影響。無非就是增加了一些字尾。假設長度為 p

pp 的字尾,原本的 max⁡e

ndpo

s\max endpos

maxend

pos 為 x

xx ,那麼區間加 [x−

p+2,

n−p+

1]

[x-p+2,n-p+1]

[x−p+2

,n−p

+1] 即可,因為左端點屬於這個區間內的時候,原來的那個沒有被包含,而這個新的被包含了。

所以就是跳字尾樹。然而字尾樹上的點代表連續區間。也就是說,p

pp 是乙個連續區間。手玩可知,加入的是乙個梯形——左邊是等差,中間是區間加,右邊是等差。線段樹顯然可以維護。

不過,用 bit

\tt bit

bit 也挺不錯,因為只有單點查詢,維護差分陣列,詢問即為區間查詢。而此時的等差數列,就是區間修改了。

然後就通過了。雖然複雜度是錯誤的。正確的複雜度要用 lct

\tt lct

lct 維護字尾樹,一條實鏈上的點都滿足 max⁡e

ndpo

s\max endpos

maxend

pos 相同,可以一起改。複雜度就是 o(n

log⁡2n

)\mathcal o(n\log^2n)

o(nlog2n

) 的。

#include

#include

#include

#include

using

namespace std;

typedef

long

long int_;

inline

intreadint()

const

int maxn =

200005

;int n;

// range of bit

namespace bit

for(

int i=r+

1; i<=n; i+

=(i&

-i))

} int_ query

(int l,

int r)

}const

int charsiz =26;

namespace sam

void

adjust

(int n)}}

struct query};

query ask[maxn]

;char xez[maxn]

;int_ ans[maxn]

;int

main()

sort

(ask+

1,ask+q+1)

;for

(int i=

1,p=

1; i<=n;

++i)

// printf("p = %d\n",p);

}for

(int i=

1; i<=q;

++i)

printf

("%lld\n"

,ans[i]);

return0;

}

洛谷 P1712 區間

在數軸上有 n個閉區間 l1,r1 l2,r2 ln,rn 現在要從中選出 m 個區間,使得這 m個區間共同包含至少乙個位置。換句話說,就是使得存在乙個 x,使得對於每乙個被選中的區間 li,ri 都有 li x ri。對於乙個合法的選取方案,它的花費為被選中的最長區間長度減去被選中的最短區間長度。...

洛谷p1603 區間dp

區間dp 在區間上進行動態規劃,求解一段區間上的最優解。主要是通過合併小區間的 最優解進而得出整個大區間上最優解的dp演算法。核心思路 思路 求解在乙個區間上的最優解,那麼把這個區間分割成乙個個小區間,求解每個小區間的最優解,再合併小區間得到大區間即可。所以可以列舉區間長度len 為每次分割成的小區...

洛谷 P2434 SDOI2005 區間

現給定n個閉區間 ai,bi 1 i n。這些區間的並可以表示為一些不相交的閉區間的並。你的任務就是在這些表示方式中找出包含最少區間的方案。你的輸出應該按照區間的公升序排列。這裡如果說兩個區間 a,b 和 c,d 是按照公升序排列的,那麼我們有a b請寫乙個程式 讀入這些區間 計算滿足給定條件的不相...