看上去好像一臉不可做。
稍微想一下就能發現是區間dp
d
p用dp
i,j dpi
,j
表示區間[i
,j] [i,
j]
是否合法
這裡合法的定義為,要麼可以按照題意直接由乙個母串多次插入而來
要麼刪掉一些母串之後剩餘部分正好是原串的字首
那麼我們只要列舉可能的母串即可
母串必須滿足條件le
n母|l
en總 len
母|le
n總
且∀(c=′a
′ ∀(c
=′a′
~′z′)nu
mz總/
numz
子==k ′z′
)num
z總/n
umz子
==k
k為定值
所以我們只要列舉合法子串即可
#include
using
namespace
std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define p pair
#define pil pair
#define pli pair
#define pll pair
#define pb push_back
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long long
char s[210];
char s[210];
bool dp[205][205];
int num[210][26];
int n;
bool check;
char ans[210];
mapvis;
void pre()
}bool cmp(int len)
void new(int len)
string x;
void work(int len)
for(int k = 1;k*len <= i;++k)
if(dp[l][r-k*len])
if(dp[r-k*len+1][r])
}if(dp[1][n]) new(len);
}int now[26];
void solve(int len)
if(!tmp) tmp = num[n][i] / now[i];
else
if(num[n][i]/now[i] != tmp)
}else
}if(!flag) continue;
rep(i,1,len) s[i] = s[i+st-1];
work(len);
}if(check)rep(i,1,len) printf("%c",ans[i]);
if(check)printf("\n");
}int main()
else
break;
if(!check) printf("%s\n",s+1);
}return
0;}
正睿 2018 提高組十連測 Day5
鴨血居然沒想到字首和優化dp,主要是寫的是刷表.只想到線段樹優化,還要兩棵.首先是暴力解法 f i j f i 1 k 0 k j 2 嗯.這個顯然可以字首和優化.然後是正常人dp解法 令f i,j 表示長度為i總和為j的合法陣列個數 則f i j f i j 1 f i 1 j 2 第二項只有j為...
2019正睿CSP S模擬賽十連測day8
link to this contest 這場題做的體驗一般,沒有 探索中求進步 的思考快感,會做的直接做,不會做的一點思路都沒有,晚了半個小時開始,提早乙個小時結束操作 t1 轉化以下題意直接模擬,t2 完全不會,去看 t3 看來看去都只會 50 的部分分,感覺也不少了就寫完放棄了,回去把 t2 ...
正睿2020提高組十連測 選做
更新中.目錄題目鏈結 理解題意,打出第乙個暴力 首先需要知道,隨機生成的樹 如果不特別說明隨機方法,就是指在所有 n 棵樹里隨機 最大深度期望是 o sqrt 的。看本題。首先,期望是嚇唬你的,因為期望乘上階乘,其實就是求和。於是我們要求 所有排列下 操作後所有點的權值和 的和 因此暴力做法就是列舉...