2 7 2 love ever 5 5 5 1 ab 5
lovever ababHintSample 1: weight(love) = 5, weight(ever) = 5, so weight(lovever) = 5 + 5 = 10 Sample 2: weight(ab) = 2 * 5 = 10, so weight(abab) = 10
ac自动机+dp,要求把路径输出来,多开一维数组,记录每一个状态的路径,然后更新答案。
代码:
/* ***********************************************
Author :xianxingwuguan
Created Time :2014-2-5 13:02:53
File Name :3.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
int cmp(char *str1,char *str2){
int len1=strlen(str1);
int len2=strlen(str2);
if(len1!=len2)
return len1<len2;
return strcmp(str1,str2)<0;
}
char str[55][1100][55];
int dp[55][1100];
struct Trie{
int next[1200][26],fail[1200],end[1200];
int root,L;
int newnode(){
for(int i=0;i<26;i++)
next[L][i]=-1;
end[L++]=-1;
return L-1;
}
void init(){
L=0;
root=newnode();
}
void insert(char *str,int id){
int len=strlen(str);
int now=root;
for(int i=0;i<len;i++){
int p=str[i]-‘a‘;
if(next[now][p]==-1)
next[now][p]=newnode();
now=next[now][p];
}
end[now]=id;
}
void build(){
queue<int> q;
fail[root]=root;
for(int i=0;i<26;i++)
if(next[root][i]==-1)
next[root][i]=root;
else {
fail[next[root][i]]=root;
q.push(next[root][i]);
}
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=0;i<26;i++)
if(next[now][i]==-1)
next[now][i]=next[fail[now]][i];
else {
fail[next[now][i]]=next[fail[now]][i];
q.push(next[now][i]);
}
}
}
void solve(int n){
for(int i=0;i<=n;i++)
for(int j=0;j<=L;j++)
dp[i][j]=-INF;
dp[0][0]=0;
char ans[110];strcpy(ans,"");
int Max=0;
strcpy(str[0][0],"");
for(int i=0;i<n;i++)
for(int j=0;j<L;j++)
if(dp[i][j]!=-INF){
int len=strlen(str[i][j]);
for(int k=0;k<26;k++){
char tmp[100];
strcpy(tmp,str[i][j]);
tmp[len]=‘a‘+k;tmp[len+1]=‘\0‘;
int tt=dp[i][j];
int pp=next[j][k];
if(end[pp]!=-1)tt+=end[pp];
if(tt>dp[i+1][pp]||(tt==dp[i+1][pp]&&cmp(tmp,str[i+1][pp]))){
dp[i+1][pp]=tt;
strcpy(str[i+1][pp],tmp);
if(dp[i+1][pp]>Max||(dp[i+1][pp]==Max&&cmp(str[i+1][pp],ans))){
strcpy(ans,str[i+1][pp]);
Max=dp[i+1][pp];
}
}
}
}
printf("%s\n",ans);
}
}ac;
char s[110][20];
int st[110];
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int i,j,k,m,n,T;
scanf("%d",&T);
while(T--){
ac.init();
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)scanf("%s",s[i]);
for(i=0;i<m;i++)scanf("%d",&st[i]);
for(i=0;i<m;i++)
ac.insert(s[i],st[i]);
ac.build();
ac.solve(n);
}
return 0;
}
原文:http://blog.csdn.net/xianxingwuguan1/article/details/18939175