大冥神的代码,以后能贴的机会估计就更少了。。。。所以本着有就贴的好习惯,= =。。。。直接贴

#include <bits/stdc++.h>
using LL = long long ;
#define ALL(v) (v).begin(),(v).end()
#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC) char str[100][11];
int n,m;
int weight[100]; const int N = 10 * 100 + 5;
int go[N][26],val[N],fail[N],tot; int get_node() {
memset(go[tot],-1,sizeof(go[tot]));
val[tot] = 0;
return tot ++;
} int dp[50 + 1][N],pre[50 + 1][N],pc[50 + 1][N];
std::vector<int> order[50 + 1]; void insert(char *s,int w) {
int u = 0;
for ( ; *s; ++ s) {
int c = *s - 'a';
if (go[u][c] == -1)
go[u][c] = get_node();
u = go[u][c];
}
val[u] += w;
} std::string work() {
tot = 0;
get_node();
for (int i = 0; i < m; ++ i) {
insert(str[i],weight[i]);
}
std::vector<int> vec{0};
fail[0] = -1;
for (int I = 0; I < (int)vec.size(); ++ I) {
int u = vec[I];
for (int c = 0; c < 26; ++ c) {
if (go[u][c] == -1) continue;
int v = go[u][c];
int f = fail[u];
while (f != -1 && go[f][c] == -1) f = fail[f];
fail[v] = f == -1 ? 0 : go[f][c];
vec.push_back(v);
}
}
for (int I = (int)vec.size() - 1; I >= 0; -- I) {
int u = vec[I];
for (int c = 0; c < 26; ++ c) {
int f = u;
while (f != -1 && go[f][c] == -1) f = fail[f];
go[u][c] = f == -1 ? -1 : go[f][c];
}
for (int f = fail[u]; f != -1; f = fail[f]) {
val[u] += val[f];
}
}
memset(dp,-1,sizeof(dp));
memset(pre,-1,sizeof(pre));
dp[0][0] = 0;
for (int i = 0; i <= n; ++ i) {
order[i].clear();
}
order[0].push_back(0);
for (int i = 0; i < n; ++ i) {
for (int u : order[i]) {
for (int c = 0; c < 26; ++ c) {
if (go[u][c] == -1) continue;
int v = go[u][c];
dp[i + 1][v] = std::max(dp[i + 1][v],dp[i][u] + val[v]);
}
}
for (int u : order[i]) {
for (int c = 0; c < 26; ++ c) {
if (go[u][c] == -1) continue;
int v = go[u][c];
if (dp[i + 1][v] == dp[i][u] + val[v] && pre[i + 1][v] == -1) {
pre[i + 1][v] = u;
pc[i + 1][v] = c;
order[i + 1].push_back(v);
}
}
}
} int ai = 0,au = 0;
for (int i = 0; i <= n; ++ i) {
for (int u : order[i]) {
if (dp[i][u] > dp[ai][au]) {
ai = i;
au = u;
}
}
}
std::string ret;
while (ai) {
ret.push_back(pc[ai][au] + 'a');
au = pre[ai][au];
-- ai;
}
std::reverse(ALL(ret));
return ret;
} int main() {
int cas;
scanf("%d",&cas);
while (cas--) {
scanf("%d%d",&n,&m);
for (int i = 0; i < m; ++ i) {
scanf("%s",str[i]);
}
for (int i = 0; i < m; ++ i) {
scanf("%d",weight + i);
}
printf("%s\n",work().c_str());
}
}

  

最新文章

  1. AC日记——最小的N个和 codevs 1245
  2. 19、ASP.NET MVC入门到精通——Unity
  3. bzoj 3211: 花神游历各国
  4. iOS开发UI篇—九宫格坐标计算
  5. hdu Collect More Jewels
  6. linux如何修改主机名
  7. mac(osx) apache无法启动 localhost无法访问服务器[]
  8. berserkJS(大名:狂暴JS / 昵称:疯子JS)
  9. HDFS Architecture--官方文档
  10. shell读取文件的每一行
  11. 13 用Css做下拉菜单
  12. matplotlib实现数据可视化
  13. 持续交付Jenkins使用
  14. JavaScript(第十二天)【基本包装类型】
  15. C# if判断语句执行顺序
  16. Codeforces 629D Babaei and Birthday Cakes DP+线段树
  17. 队列优化的dijkstra
  18. 安装mysqlclient的时候出现Microsoft Visual C++ 14.0 is required报错
  19. eclipse中tomcat无法加载spring boot
  20. 电商项目中学到的git命令

热门文章

  1. Say goodbye to my photos&amp;videos
  2. Vim Using
  3. JS中字符串的true转化为boolean类型的true
  4. C# 带签名dll破解
  5. 图片下方出现多3px的原因及解决方法
  6. Openjudge 1.13-21:最大质因子序列(每日两水)
  7. textarea 中的 innerHTML 和 value
  8. 【C#】菜单功能,将剪贴板JSON内容或者xml内容直接粘贴为类
  9. linux系统下使用流行的版本管理工具 Git
  10. 修改/etc/profile和/etc/environment导致图形界面无法登陆的问题