題目描述
小苗在學習字串。在以下說明中,我們僅考慮由小寫字母構成的串。
很不幸的是,小苗在學習 suffix array 時把概念記錯了:現在她認為陣列sa
的互逆陣列是原串 s
ss,然而sa
的互逆陣列應該是rank
: (。
為了幫助小苗同學,現給定一字串 s
ss ,請你判斷是否存在 t
tt ,使得 s
ss 與 t
tt 的sa
陣列相同,且 t
tt 的字典序比 s
ss 小。
具體來說,sa
是乙個一維陣列,它儲存從 1
11 到 n
nn 的某個排列 ,並且對於 1≤i
<
n1 \leq i < n
1≤i<
n,保證 s[s
ai…n
]s[sa_i\dots n]
s[sai
…n] 的字典序小於 s[s
ai+1
…n
]s[sa_\dots n]
s[sai+
1…n
] 的字典序。
輸入格式
一行乙個字串 s
ss 。保證僅由小寫字母構成。
輸出格式
如果存在相應的 t
tt ,則輸出exists
;否則輸出does not exist
。
你需要保證對應的 t
tt 也由小寫字母構成。
輸入輸出樣例
說明/提示
設 s
ss 的長度為 n
nn,對於所有子任務,有 n≤50
n \leq 50
n≤50。
性質是,t
tt 與 s
ss 最多相差乙個字元。因此我們列舉 s
ss 中的乙個不為a
的字元並將其減一得到 t′t'
t′,再判斷 s
ss 與 t′t'
t′的sa
是否相同即可。
證明:我們只需證明,如果 s
ss 改變乙個字元無法做到sa
相同,那麼改變更多的也不能做到sa
相同。考慮我們已知 s
ss 的sa
陣列 sasa
sa,則rank
陣列 rkrk
rk也可以得到。對於任意乙個 1≤i
<
n1 \leq i < n
1≤i<
n,假設越界的地方 rkrk
rk為 0
00,有 s[s
ai
]
sai+
1]或(
s[sa
i]=s
[sai
+1]且
rk[s
ai+1
] [sai +1+1 ]) s[sa_i] < s[sa_] \ 或 \ (s[sa_i]=s[sa_] \ 且 \ rk[sa_i + 1] < rk[sa_ + 1]) s[sai ]sai+ 1]或 (s[s ai] =s[s ai+1 ]且r k[sa i+1 ][sai +1+ 1]) 於是有 s[sa_i] < s[sa_], & (rk[sa_i + 1] \geq rk[sa_ + 1]) \\ s[sa_i] \leq s[sa_], & (rk[sa_i + 1] < rk[sa_ + 1])\end std:: sort (suf. begin() , suf. end()) ;for (int i = 0; i < int(suf. size() ); i++ ) sa[i +1] = n - suf[i] .length() +1;} intmain() }puts ("does not exist"); return0; }半暴力:#include
#include
#include
#include
#include
const
int maxn =50;
int n;
bool p[maxn +5]
;char s[maxn +5]
;int sa[maxn +5]
, rank[maxn +5]
;std::vector suf;
void
getsa
(char
*str,
int*sa)
std::
sort
(suf.
begin()
, suf.
end())
;for
(int i =
0; i <
int(suf.
size()
); i++
) sa[i +1]
= n - suf[i]
.length()
+1;}
intmain()
}}puts
("does not exist");
return0;
}然而兩個時間只差一毫秒 = =
字尾陣列模板(詳細理解)
字尾陣列看了很久了,從基數排序開始看乙隻看到height陣列的實現也理解了很多東西,不過別人的東西再多也不是自己的,因此自己重新總結了一下,順便學乙個字尾陣列的模板備用,這裡以spoj 694為例。include include include include include using names...
字尾陣列的理解於模板
字尾陣列主要是得出 sa i pos 排名第i的是pos位置開始的 這裡用於排名的都是原串中以不同位置開始到最後的字串按照字典序排序 height i 是 suffix sa i 1 和 suffix sa i 的最長公共字首長度,即排名相鄰的兩個字尾的最長公共字首長度。原理可以參考 解釋 incl...
Tyvj P1860 字尾陣列 字尾陣列模板題
tyvj傳送門 輸入格式 一行,為描述中的字串 僅會出現小寫字母 輸出格式 共兩行,每行n個數,第一行為sa i 第二行為height i 其中每行的數均用空格隔開 測試樣例1 輸入aabaaaab 輸出4 5 6 1 7 2 8 3 0 3 2 3 1 2 0 1 sol 發現了自己程式的乙個bu...