国产成人毛片视频|星空传媒久草视频|欧美激情草久视频|久久久久女女|久操超碰在线播放|亚洲强奸一区二区|五月天丁香社区在线|色婷婷成人丁香网|午夜欧美6666|纯肉无码91视频

解密USACO 2.3.1最長前綴問題

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

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

---

背包問題的第一印象

當(dāng)我們遇到這個(gè)問題時(shí),可能會(huì)首先想到使用動(dòng)態(tài)規(guī)劃中的背包問題來解決。但事實(shí)上,有更巧妙的解法等待我們?nèi)グl(fā)現(xiàn)。

---

直接定義bool數(shù)組

其實(shí),我們并不需要定義一個(gè)整型的dp數(shù)組,然后在其中存儲(chǔ)前i個(gè)元素的最大值。我們可以直接定義一個(gè)bool數(shù)組,從前向后循環(huán)一遍,將能湊出的前綴都標(biāo)記為1,其余初始化為0。

---

反向遍歷找出最長前綴

最后,我們可以從后向前遍歷數(shù)組,找出最后一個(gè)值為真的位置,并輸出其序號(hào)即可。通過類似以下代碼實(shí)現(xiàn):

```c

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

if(dp[i] true){

cout << i << endl;

break;

}

}

```

---

完整代碼實(shí)現(xiàn)

下面是一個(gè)C 的示例代碼,展示了如何實(shí)現(xiàn)這個(gè)最長前綴問題的算法:

```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;

}

```

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

標(biāo)簽: