題面:luogu4770
題意:給定乙個串s
ss。每次詢問給出乙個字串t
tt,問t
tt有多少個不同的子串使得其也不是s[l
…r
]s[l … r]
s[l…r]
的子串。∣s∣
≤5×1
05
|s| \le 5 \times 10^5
∣s∣≤5×
105,q≤1
05
q \le 10^5
q≤105,∑∣t
∣≤10
6\sum |t| \le 10^6
∑∣t∣≤1
06題解:首先考慮部分分l=1
,r=∣
s∣
l = 1, r = |s|
l=1,r=
∣s∣的做法:對s
ss和t
tt建字尾自動機。對t
tt的每個位置求出以這個位置為右端點,向左最多匹配s
ss的長度mxmx
mx。那麼對於t
tt字尾自動機每個節點,其貢獻的答案為len
[v]−
max(
len[
link
[v]]
,mx)
len[v] - max (len[link[v]], mx)
len[v]
−max
(len
[lin
k[v]
],mx
)。考慮l ,r
l, r
l,r任意的情況。對於每個s
ss的每個節點開棵線段樹維護end
po
sendpos
endpos
。線段樹合併。
一樣在s
ss的字尾自動機上匹配。現在需要詢問字尾自動機上當前節點的所有end
po
sendpos
endpos
能否將該串放入[l,
r]
[l, r]
[l,r]。
即詢問[l+
len−
1,r]
[l + len - 1, r]
[l+len
−1,r
]有沒有合法的end
po
sendpos
endpos
#include
using
namespace std;
inline
intread()
while
(c >=
'0'&& c <=
'9') x = x *
10+ c -
'0', c =
getchar()
;return x * f ;
}typedef
long
long ll ;
const
int maxn =
1e6+10;
int n ;
char s[maxn]
;int mx[maxn]
, rt[maxn]
, c[maxn]
, p[maxn]
;vector<
int> e[maxn]
;struct segmenttree
int merge (
int x,
int y)
bool query (
int x,
int l,
int r,
int l,
int r)
}tree ;
struct suffixautomaton st[maxn]
;void init (
) sz = last =1;
}void insert (
int c,
int id)if(
!p)int q = st[p]
.nxt[c];if
(st[p]
.len +
1== st[q]
.len)
else
st[cur]
.link = st[q]
.link = clone ;
} last = cur ;
}}a, b ;
void dfs (
int v)
}bool check (
int u,
int len,
int l,
int r,
int c)
intmain()
for(
int i =
1; i <= a.sz; i ++
) e[a.st[i]
.link]
.push_back (i)
; dfs (1)
;int q, l, r ;
scanf
("%d"
,&q)
;while
(q --)if
(!u) u =
1, ln =0;
else u = a.st[u]
.nxt[s[i]
-'a'
], ln ++
; b.insert (s[i]
-'a'
, i)
; mx[i]
= ln ;
} ll ans =0;
for(
int i =
2; i <= b.sz; i ++
) ans +
= max (
0, b.st[i]
.len - max (mx[b.st[i]
.pos]
, b.st[b.st[i]
.link]
.len));
printf
("%lld\n"
, ans);}
return0;
}
Luogu3823 NOI2017 蚯蚓排隊
題面 luogu3823 題意 n nn只蚯蚓,每只蚯蚓有乙個 6 le 6 6的長度,初始時每只蚯蚓一支隊伍。給出m mm個操作。三種操作 將以i ii結尾的隊伍和以j jj開頭的隊伍合併,且i ii的隊伍在前。將i ii和i ii後面乙隻蚯蚓處斷開,分為兩支隊伍。定義以第x xx只蚯蚓開始的長度...
Luogu 2254 NOI2005 瑰麗華爾茲
簡單dp,設 f 表示第i個時間段,鋼琴處在 j,k 位置移動距離的最大值,那麼有轉移 f max f f max f 其中 j dx len leq a leq j 1 k dy len leq b leq k 1 len ed st 1 其實就是乙個滑動視窗,考慮到轉移順序,就是寫四遍單調佇列 ...
luogu1106 刪數問題(NOI1994)
時空限制 1000ms 128mb 鍵盤輸入乙個高精度的正整數n,去掉其中任意k個數字後剩下的數字按原左右次序將組成乙個新的正整數。程式設計對給定的n和k,尋找一種方案使得剩下的數字組成的新數最小。輸出應包括所去掉的數字的位置和組成的新的整數。n不超過250位 輸入資料均不需判錯。輸入格式 n 高精...