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,他發現資料生成器似乎並不能保證資料合法...