BZOJ1093 SCOI2003 字串摺疊

2022-05-16 03:08:44 字數 1478 閱讀 6759

摺疊的定義如下: 1. 乙個字串可以看成它自身的摺疊。記作s  s 2. x(s)是x(x>1)個s連線在一起的串的摺疊。記作x(s)  ssss…s(x個s)。 3. 如果a  a』, bb』,則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,...