兩道來自CF的題

2022-03-24 21:23:38 字數 1859 閱讀 2161

本菜鳥又在cf div2水了一次,這次的5道題只做出了兩道,div2的c,d(div1的a,b),不錯的題目,可惜當時只想到了一半半,要繼續修煉呀。

題意是這樣的,給定兩個串s1,s2,s1可以使用多次,拼成s1s1s1…s1這種串,然後去掉任意多個字母能變成s2,問說最少用多少個s1。

暴力的思路比較好想,在s1,s2上設立兩個指標,都是單向的,相應進行匹配,如果s1處的指標走滿後,就另起乙個,但這樣的複雜度是o(ans*|s1|),主要的開銷在於s1上的指標每次都要走來走去的,因為字典就a…z這26種,每次找過的a,又得重新再找一遍,太冗餘了,可以用dp(i, j)記錄從i…len(s1)這個串中,最左邊的字母j的位置,這樣就可以快速定位i指標的位置了。預處理dp(i, j)的時間複雜度是o(26*|s1|),總的複雜度為o(26*|s1| + |s2|),這樣的複雜度就可以ac了,也可以這樣優化,建立26個有序表,然後二分快速定位相應的位置,這樣的話可以把複雜度降為o(|s1| + |s2| * log|s2|),補充一句,題解說可以用b樹優化。**如下:

#include

#include

#include

#include

#include

using

namespace std;

const

int max = 1e4 + 5;

string s1, s2;
int d[max][26];    //d[i][j]表示從s1[i],s1[i+1],...,s1[len(s1)]中最左邊的i在**
int main()
i = 0;
int ans = 0, j = 0;
while(j < len2)
else
}
if(j < len2)  cout << "-1";
else  cout << ans + 1;
}

題意是這樣的,n個整數組成乙個序列,用a1, a2, …, an表示,對於每個每個位置i,求出i右邊,最遠的j使得aj < ai。題解的方法很巧妙,建立陣列m,m[i]表示從ai到an中的最小值,則m[i]是個遞減陣列,然後列舉的時候,二分逼近那個最遠的邊界就可以了,複雜度是o(n*logn),有人提到先對陣列排序後,然後列舉,並儲存最遠的位置,也是個不錯的方法,但要注意陣列中的值可能相等,複雜度也是o(n*logn)。前者方法的**如下:

#include

#include

#include

#include

using

namespace std;

const

int max = 1e5 + 5;

int v[max], r[max], m[max], n;
int main()
if(high >= i)  r[i] = high;
else  r[i] = i;
}
for(int i = 1; i <= n; i++)
cout << r[i] - i - 1 << " ";
}

益智題 (簡單的兩道題)

a公司拍攝的 黃河頌 獲最佳故事獎 b公司的 孫悟空 獲最佳武術獎 c公司的 白娘子 獲最佳戲劇獎。a公司的經理說 我們三經理的姓分別是三部片名的第乙個字,而又同自己所拍 首字不一樣。另一公司的孫經理笑著說 真是這樣 那三經理各姓什麼?答案 a白 b黃 c孫 另一公司的孫經理 說明a不姓孫,而a又不...

兩道題題引發的思考

下週的討論課又到我講 了,這幾天都在看 準備ppt,選了一篇好難的 啊,看了這麼久了,還是不夠清晰。所以決定先換下思路,做點題。下面的 輸出是什麼 void add int p add p int main 分析這個題目看起來還是比較友好的。首先我們來分析一下add 函式。其實看名字就能知道它是在做...

兩道選擇題

教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車禍,痊癒後,臉上留下幾...