題意:
給定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 任意組合的...