Luogu4770 NOI2018 你的名字

2021-09-25 00:15:01 字數 3111 閱讀 1071

題面: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 高精...