摺疊的定義如下: 1. 乙個字串可以看成它自身的摺疊。記作s s 2. x(s)是x(x>1)個s連線在一起的串的摺疊。記作x(s) ssss…s(x個s)。 3. 如果a a』, bb』,則ab a』b』 例如,因為3(a) = aaa, 2(b) = bb,所以3(a)c2(b) aaacbb,而2(3(a)c)2(b)aaacaaacbb 給乙個字串,求它的最短摺疊。例如aaaaaaaaaabababccd的最短摺疊為:9(a)3(ab)ccd。
僅一行,即字串s,長度保證不超過100。
僅一行,即最短的摺疊長度。
neercyesyesyesneercyesyesyes
14乙個最短的摺疊為:2(neerc3(yes))
令$f_$為[i,j)這一段字串的最短摺疊長度。
那麼,顯而易見的有
$$f_=1$$
$$f_=min\left(min\ +f_\mid i < k < j\}, min\ + 2 + num((j - i) / (k - i)) \mid i < k < j, s_ = \fracs_\}\right)$$
其中$num(x)$表示$x$的十進位制位數, $s_$表示字串中i到j的一部分。
那麼,應該如何判斷$s_$是否由$s_$重複得到呢?
比較$s_$和$s_$即可。
暴力比較就好了。
時間複雜度$o(n^3logn)$
咦,為什麼是這個複雜度(不想看請跳過)?
對於每乙個長度$len$,都有$n-len+1$個長為$len$的區間,每個區間所需要的字元比較次數至多為
$$\sum_(len-d)$$
那麼總比較次數至多為
$$\begin
\sum_^n(n-l+1)\sum_(l-d) &\leq \sum_^nn\sum_l\\
&= n\sum_^nl\sum_1\\
&= n\sum_^n\sum_l\\
&= n\sum_^nd\sum_^d\rfloor}l'\\
&= n\sum_^nd\fracd\rfloor\left(\lfloor\fracd\rfloor+1\right)}2\\
&\leq n\sum_^n\fracd+1\right)}2\\
&\backsim \frac2\sum_^n\fracd\\
&=o(n^3logn)\end$$
所以暴力比較只多了乙個$log$,可以接受。
附**:
#include #include #include using std::min;char s[105];
inline bool eq(int b1, int b2, int len)
inline int wei(int x)
int f[105][105];
int main()
}printf("%d\n", f[0][n]);
return 0;
}
BZOJ 1079 SCOI2008 著色方案
題目 分析 一看就覺得是dp或者直接排列組合公式或者容斥?我就只想到dp的,我們用dp i j 表示前i種顏色,排列出有j對相鄰一樣顏色的方案數。當出現乙個新的顏色時,我們把這個顏色插板法插進去,我們要列舉插入的方式,可能插到相鄰顏色一樣的中間,或者不是,然後進行狀態轉移.具體看 include i...
BZOJ1066 SCOI2007蜥蜴 最大流
挺顯然的最大流,源向所有有蜥蜴的點連inf邊,所有點拆成入點和出點,入店向出點連流量為高度的邊,限制流量,所有可以一步跳出去的點向匯連inf邊,跑最大流就行了。include include include define inf 99999999 define maxn 1005 using nam...
BZOJ1079 SCOI2008著色方案 DP
只能想到 5 15 的方法。我們要利用起 ci比較小這個性質,f a b c d e last 表示有a 種顏色用了1個,b種顏色用了2個 上一次染色用的是剩餘 last 個的顏色,轉移就是f a,b,c,d,e,last a last 2 f a 1,b,c,d,e b last 3 f a 1,...