String Game (二分 桶 雙指標)

2021-10-02 06:51:17 字數 1040 閱讀 7388

題目鏈結

題意:給乙個長為len的字串str1和乙個長度不超過str1的字串str2,以及乙個操作序列,每個操作a[i],代表刪去str1中的第a[i]個字元。問操作最多進行到第幾步,str2不再是str1的子串行?刪去某字元後後str1剩餘字元的下標保持不變。保證最初的str2是str1的子串行(通過刪去str1的某些字元可以得到str2)。

思路:二分操作步數,單調性顯然:如果刪去某一位能使str2仍是str1的子串行,那麼不刪這一位當然更是可以滿足條件,如果刪去這一位就不能滿足條件,那麼這一位就不能刪,再在操作序列往前找刪除的最後一步。

怎麼check呢?

對長為len的str1的下標做乙個桶vis,對於操作序列1~len,當操作步數二分到x步,把a陣列[1,x]的(前x步)操作的下標標記為1(vis[index[i]]=1),代表str1的index[i]位置的字元已刪除。如何匹配子串行呢?從1~len遍歷這個桶,同時pos指標從頭開始遍歷str2,如果vis[i]==0(代表str1的第i位未被刪除),並且str1[i]==str2[pos](匹配上啦),就pos++,這個子串行匹配有點雙指標的意思在裡面。

這個把str1的下標做成桶來匹配的思想真的好絕,解決了前x步刪除了x個字母後,還要保證str1剩下的字母相對順序不變這個問題(這樣才能跟str2作匹配)。天吶。

#includeusing namespace std;

const int n=2e5+5;

char str1[n],str2[n];

bool vis[n];

int index[n];

int main()

if(str2[pos]==0) ans=mid,l=mid+1;

else r=mid-1;

}cout《碎碎念:

cf某1600分題

我寫了兩天沒寫出來。。。

一開始想,是不是二分?但怎麼分呢。。好像不太容易,沒往下想

後來又想用樹狀陣列,對操作序列作區間修改,好像又不太行

又想到kmp,學了半天,發現題目匹配的是子串行。。(((φ(◎ロ◎;)φ)))

努力改錯哦

dfs 二分,雙向dfs

達達幫翰翰給女生送禮物,翰翰一共準備了n個禮物,其中第i個禮物的重量是g i 達達的力氣很大,他一次可以搬動重量之和不超過w的任意多個物品。達達希望一次搬掉盡量重的一些物品,請你告訴達達在他的力氣範圍內一次效能搬動的最大重量是多少。輸入格式 第一行兩個整數,分別代表w和n。以後n行,每行乙個正整數表...

1128 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

Hive(二) 分區分桶,內部表外部表

hive是hadoop生態圈中實現資料倉儲的一項技術。雖然hadoop和hdfs的設計侷限了hive所能勝任的工作,但是hive仍然是目前網際網路中最適合資料蒼鷺的應用技術。不論從 品相還是舉止 hive都像乙個關係型資料庫。使用者對資料庫 表和列這類術語比較熟悉的話,那麼掌握hive的查詢語言hq...