今天Codeforces燒機
所以只能上TIOJ解解題目 (´;ω;`)
然後就發現建中的校內賽有夠難的
果然是全台第一志願
TIOJ 2155 - 對發票 Again!
看到這題時 發現就是要找所有字串的共同子字串且這個子字串在每個字串中不重複
突然想到不久前才學過的 Suffix Array 可以做到這件事情
所以就開始刻這題了
舉例
1 | 5 |
我們先將這些字串串起來 然後找出這幾個的 LCP Array
最後將後綴編號 最後選取所有編號都出現一次的那個 找出LCP值
且與前後比對 就可以找到不重複的共同子字串1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38aaamen
aamen
==========================================================================
這段是我們所要選的答案 LCP大小為: 2 共同子字串為: "am"
am#diamond$ 編號:4 ,與前一個的LCP: 1
amen#lamian#raaamen#yesiam#diamond$ 編號:1 ,與前一個的LCP: 2
amen#yesiam#diamond$ 編號:3 ,與前一個的LCP: 5
amian#raaamen#yesiam#diamond$ 編號:2 ,與前一個的LCP: 2
amond$ 編號:5 ,與前一個的LCP: 2
==========================================================================
an#raaamen#yesiam#diamond$ 編號:2 ,與前一個的LCP: 1
d$ 編號:5 ,與前一個的LCP: 0
diamond$ 編號:5 ,與前一個的LCP: 1
en#lamian#raaamen#yesiam#diamond$ 編號:1 ,與前一個的LCP: 0
en#yesiam#diamond$ 編號:3 ,與前一個的LCP: 3
esiam#diamond$ 編號:4 ,與前一個的LCP: 1
iam#diamond$ 編號:4 ,與前一個的LCP: 0
iamond$ 編號:5 ,與前一個的LCP: 3
ian#raaamen#yesiam#diamond$ 編號:2 ,與前一個的LCP: 2
lamian#raaamen#yesiam#diamond$ 編號:2 ,與前一個的LCP: 0
==========================================================================
這段不是我們要選的答案 LCP大小為: 0 共同子字串為: ""
m#diamond$ 編號:4 ,與前一個的LCP: 0
men#lamian#raaamen#yesiam#diamond$ 編號:1 ,與前一個的LCP: 1
men#yesiam#diamond$ 編號:3 ,與前一個的LCP: 4
mian#raaamen#yesiam#diamond$ 編號:2 ,與前一個的LCP: 1
mond$ 編號:5 ,與前一個的LCP: 1
==========================================================================
n#lamian#raaamen#yesiam#diamond$ 編號:1 ,與前一個的LCP: 0
n#raaamen#yesiam#diamond$ 編號:2 ,與前一個的LCP:2
n#yesiam#diamond$ 編號:3 ,與前一個的LCP:2
nd$ 編號:5 ,與前一個的LCP:1
ond$ 編號:5 ,與前一個的LCP:0
raaamen#yesiam#diamond$ 編號:3 ,與前一個的LCP:0
ramen#lamian#raaamen#yesiam#diamond$ 編號:1 ,與前一個的LCP:2
siam#diamond$ 編號:4 ,與前一個的LCP:0
yesiam#diamond$ 編號:4 ,與前一個的LCP:0
1 |
|
不過這題最後我砸了很多次
發現錯在Counting sort的時候使用vector會太慢
所以把Counting sort改成用陣列就可以過了
TIOJ 2151 - 大富翁
這題很明顯就是裸矩陣快速冪
所以刻出來就過了
1 |
|