BZOJ1090 SCOI2003 字串摺疊

2022-05-26 19:30:14 字數 1205 閱讀 2174

摺疊的定義如下: 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))\)

區間dp,設\(dp(l,r)\) 表示字串在\((l,r)\) 中的最短摺疊長度,有兩種轉移方式:都是列舉分割點,一種是\(dp(l,r)=dp(l,i)+dp(i+1,r)\) 直接拼接,另一種是包括週期串的情況,我們強行令左邊字串是右邊字串的週期,這個本應可以預處理了,但是反而會使**複雜度變高,於是就變成了:\(dp(l,r)=dp(l,i)+2+w[+1]\) 其中\(w[i]\) 表示i這個數的位數。總複雜度\(o(n^4)\)

#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef pairpii;

#define mem(a,b) memset(a,b,sizeof(a))

inline int read()

while(isdigit(c))

return x*f;

}const int maxn=110;

char s[maxn];

int len,w[maxn],dp[maxn][maxn];

bool check(int l1,int r1,int l2,int r2)//s(l1,r1)為s(l2,r2)的週期

int dp(int l,int r)

{ if(rdp有時候強行令一些設定反而會帶來更優的效果。

bzoj1090 SCOI2003 字串摺疊

time limit 10 sec memory limit 162 mb submit 1718 solved 1146 submit status discuss 摺疊的定義如下 1.乙個字串可以看成它自身的摺疊。記作s s 2.x s 是x x 1 個s連線在一起的串的摺疊。記作x s sss...

BZOJ1090 SCOI2003 字串摺疊

給出乙個字串,可以將相鄰的重複的子串合併在一起,如 abaaaabba,可以合併為ab4 a bba 注意,數字和括號均算作字元,數字有多少位就相當於有多少個字元 請問怎麼合併才能使字串的長度最小 也可以不合併 區間dp,本來想著會t,結果應該是不會詢問這麼多遍,所以耗時可觀 f i j 表示第i個...

1090 SCOI2003 字串摺疊

題目鏈結 題目大意 摺疊的定義如下 1.乙個字串可以看成它自身的摺疊。2.x s 是x x 1 個s連線在一起的串的摺疊,記作x s 3.摺疊可以巢狀。給乙個字串,求它的最短摺疊。題解 區間dp f l r 表示 l r 壓縮後最短長度,初始值f l r r l 1 轉移 列舉區間分割點k,l k ...