5073 Lydsy1710月賽 小A的咒語

2022-02-05 02:00:26 字數 1127 閱讀 8881

link:[lydsy1710月賽]小a的咒語

每次給定兩個串 要求從a串中選出x段拼成b串 能否做到。t組資料。

\(n\leq 100000,m\leq 100000,t\leq 10,x\leq 100\)

首先考慮貪心的從前往後匹配 若果當前匹配位置比之前還要遠覆蓋之前的 但是這樣做會出現問題。

可能當前匹配的是之前匹配的後面的一段 也可能是之前的一段。

所以需要dp來解決這個後效性問題 設g[i][j]表示前i段個字元選出了j段所能拼成b串的最大長度。

有g[i][j]=g[i-1][j] 考慮匹配的時候 從i+1 和g[i][j]+1進行匹配。

為什麼要這樣做考慮g陣列值小一點顯然當前大一點的g陣列比小一點的要優 給後面帶來的結果不會更差。

由於第二維狀態的存在也解決了上述 到底是匹配之前的還是匹配之後的問題。

考慮轉移 列舉k 進行轉移 f[i+k][j+1]=f[i][j]+k; 考慮這裡的k取到最大值的時候對後面結果不會更差。

注意這裡只能採用刷表法 因為填表的話還是不知道k是多少。

多組資料 注意清空。

const int maxn=400010;

int n,k,m,ww,l,r,w1,w2;

int x[maxn],y[maxn],sa[maxn],rk[maxn],h[maxn],c[maxn];

int f[maxn][21],log[maxn],g[100010][103];

char a[maxn];

inline void sa()

rep(1,n,i)rk[sa[i]]=i;

}inline void get_height()

rep(2,n,i)

rep(1,log[n-1],j)

rep(1,n-1-(1w2)return 0;

x=rk[x];y=rk[y+w1+1];

if(x>y)swap(x,y);--y;

int z=log[y-x+1];

return min(f[x][z],f[y-(1<>1]+1;

while(t--)

else puts("no");

} return 0;

}

Lydsy月賽合輯

不想單開的就寫在這裡了 都還是挺不錯的啊 許可權題沒有 又是被ozy秒殺的我 不考慮嚴格大於的話你直接ai,bi取個max就過了 現在要考慮嚴格大於,相當於每個矩形,都是一條在ai,bi中的邊 我們定義這個數被作為一次長,當且僅當有一條新的邊指向了他 最後我們就要給所有邊定向,顯然要求每個數最多只有...

bzoj4919 Lydsy1706月賽 大根堆

給定一棵n個節點的有根樹,編號依次為1到n,其中1號點為根節點。每個點有乙個權值v i。你需要將這棵樹轉化成乙個大根堆。確切地說,你需要選擇盡可能多的節點,滿足大根堆的性質 對於任意兩個點i,j,如果i在樹上是j的祖先,那麼v i v j。請計算可選的最多的點數,注意這些點不必形成這棵樹的乙個連通子...

bzoj5127 Lydsy12月賽 資料校驗

多少年不寫題解了 題目描述 著名出題人小 q 出了一道題,這個題給定乙個正整數序列 a1,a2,an,並保證輸入資料中,對於 a 的任意乙個非空連續子區間 l,r 該區間內出現過的數值在整數上值域連續。現在小 q 生成了乙個長度為 n 的序列 b1,b2,bn,他發現資料生成器似乎並不能保證資料合法...