久久精品国产99国产精品,农村大炕弄老女人,人马配速90分钟,香蕉成人伊视频在线观看

解密USACO 2.3.1最長前綴問題

在USACO競賽中,經常會遇到各種有趣而復雜的問題。今天我們來探討2.3.1版本中的一個關于最長前綴的問題。題目要求對給定的一個字符串組和一個字符串,找出最長的前綴,使得這個前綴可以由字符串組中的元素

在USACO競賽中,經常會遇到各種有趣而復雜的問題。今天我們來探討2.3.1版本中的一個關于最長前綴的問題。題目要求對給定的一個字符串組和一個字符串,找出最長的前綴,使得這個前綴可以由字符串組中的元素組成。

---

背包問題的第一印象

當我們遇到這個問題時,可能會首先想到使用動態規劃中的背包問題來解決。但事實上,有更巧妙的解法等待我們去發現。

---

直接定義bool數組

其實,我們并不需要定義一個整型的dp數組,然后在其中存儲前i個元素的最大值。我們可以直接定義一個bool數組,從前向后循環一遍,將能湊出的前綴都標記為1,其余初始化為0。

---

反向遍歷找出最長前綴

最后,我們可以從后向前遍歷數組,找出最后一個值為真的位置,并輸出其序號即可。通過類似以下代碼實現:

```c

for (i size; i > 0; i--){

if(dp[i] true){

cout << i << endl;

break;

}

}

```

---

完整代碼實現

下面是一個C 的示例代碼,展示了如何實現這個最長前綴問題的算法:

```c

include

include

include

using namespace std;

int main(){

freopen("","r",stdin);

freopen("prefix.out","w",stdout);

char s[200002];

string tmps;

int count0, flag0, size0;

string str[201];

cin >> tmps;

while(tmps[0] ! '.'){

str[count] tmps;

count ;

cin >> tmps;

}

while (!cin.eof()){

flag ();

for(int i 1; i < flag; i ){

s[size i] tmps[i - 1];

}

size flag;

cin >> tmps;

}

int i, j, k, tmpsize;

bool ok, dp[200002];

memset(dp, false, sizeof(bool)*200002);

dp[0] true;

for(i 0; i < size; i ){

if(dp[i] false) continue;

for(j 0; j < count; j ){

tmpsize str[j].size();

ok true;

for(k 0; k < tmpsize; k ){

if(s[i k 1] ! str[j][k]){

ok false;

break;

}

}

if(ok) dp[i tmpsize] 1;

}

}

for(i size; i > 0; i--){

if(dp[i] true){

cout << i << endl;

break;

}

}

return 0;

}

```

通過以上代碼示例,我們可以清晰地了解如何解決這個最長前綴問題。希望這篇文章對你有所幫助!

標簽:
主站蜘蛛池模板: 赤城县| 防城港市| 泰来县| 云和县| 广平县| 浏阳市| 汉沽区| 上杭县| 辽中县| 贺州市| 凉城县| 平阴县| 张掖市| 扬州市| 贵州省| 思茅市| 昔阳县| 阿瓦提县| 察哈| 五原县| 镇巴县| 长宁县| 鄄城县| 汪清县| 新野县| 盱眙县| 易门县| 宁海县| 昂仁县| 陵水| 攀枝花市| 华池县| 黄浦区| 周宁县| 阳新县| 东莞市| 济南市| 大连市| 延川县| 鄄城县| 富源县|