hdu2296 Ring(AC自動機上dp)

2021-10-23 21:09:52 字數 1454 閱讀 7793

題意:

給定m個不同的單詞,單詞由小寫字母組成,每個單詞都有自身的價值。

現在你要設計乙個字串,字串的長度不能超過n。

如果字串裡面包含了某個單詞,就可以獲得相應的價值。

價值可以重複計算。單詞可以相互重疊。

輸出構造的最大價值的字串。

如果價值相同,就選擇長度最短的,如果長度一樣短,那麼就選擇字典序最小。

資料範圍:n<=50,m<=100

解法:

建立ac自動機,

容易想到令d[i]

[j]表示走i步,當前在j節點上的最大價值,

因為要輸出串的方案,還需要記錄路徑,

因為串長度不超過50

,直接開string類的陣列path[i]

[j]記錄整個路徑的串,比較的時候也是直接比較就行了.

在ac自動機上dp即可.

注意特判最大價值等於0的情況,這時候應該輸出空串.

code:
#include

using

namespace std;

const

int maxm=

2e3+5;

char s[maxm][15

];int n,m;

struct ac

tot=0;

}void

add(

char

*s,int x)

val[node]

+=x;

}void

build()

}while

(!q.

empty()

)else}}

}//int d[55]

[maxm]

;//d[i][j]表示走i步當前在j節點的最大價值.

string path[55]

[maxm]

;void

solve()

}//dp

d[0]

[0]=

0;for(

int i=

0;i)else

if(temp==d[i+1]

[x])}}

}}int ma=0;

for(

int j=

0;j<=tot;j++)if

(ma==0)

string ans;

for(

int i=

0;i<=n;i++)}

}if(ans!="")

break;}

cout<}}ac;

signed

main()

for(

int i=

1;i<=m;i++

) ac.

build()

;//ac.

solve()

;}return0;

}

HDU4622 字尾自動機

題目 reincarnation 題意 給定乙個字串,然後再給定q個詢問,每個詢問是乙個區間 l,r 問在這個字串區間中有多少個不同的子串。字尾自動機模版題 include include include include using namespace std const int n 5010 st...

hdu4436 字尾自動機

題解 求多個字串能夠構成多少種數然後把這些數去重後加起來,字尾自動機有個性質就是路徑數就等於不同子串個數,然後怎麼把多個字串拼接呢,兩個字串中間加入乙個你不會用的字元,因為這樣可以保證我到時候路徑不會走這條 include include include include include includ...

HDU 4622(字尾自動機)

czh得意的向cry炫耀自己的英文水平,cry很不屑的扔給czh一篇文章,雖然czh看完之後頭暈眼花,但他還是決定猜測一下文章中單詞的意思,由於文章連空格都沒有,這大大增加了閱讀的難度,於是他決定退而求其次,只需要計算一下從第l個字元到第r個字元中有多少個可能的互不相同單詞 任意長度 1 任意組合的...