标签:
#include<iostream> #include<queue> #include<string> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int LO=26,NU=10005; inline int f(char u){ return u-‘a‘; } struct tree{ int f; int q; int t[LO]; int v[LO]; }t[NU]; int n,m,p,num,w; bool us[NU]; char s[100][100]; queue <int> q; int dp[51][NU]; string ss[51][NU],str; inline int dfs(int x){ if (us[x]) return t[x].q; us[x]=1; if (!x) return 0; return t[x].q+=dfs(t[x].f); } inline void in(int x){ int p=0,l,m=strlen(s[x]); for (register int i=0;i<m;i++){ l=f(s[x][i]); if (!t[p].t[l]) t[p].t[l]=++num; p=t[p].t[l]; } t[p].q=w; } inline void mafa(){ register int i;int k,p; q.push(0);t[0].f=0; while(!q.empty()){ k=q.front();q.pop(); for (i=0;i<LO;i++) if (t[k].t[i]){ p=t[k].f; while((!t[p].t[i])&&p) p=t[p].f; t[t[k].t[i]].f=(k==p)?0:t[p].t[i]; q.push(t[k].t[i]); } } } int main(){ int tt; scanf("%d",&tt); register int i,j,k,l;int u;int ans; while(tt--){ scanf("%d%d",&n,&m); num=u=ans=0; for (i=0;i<m;i++) scanf("%s",s[i]); for (i=0;i<m;i++){ scanf("%d",&w); in(i); } mafa(); for (i=0;i<=num;i++) us[i]=0; for (i=0;i<=num;i++) if (!us[i]) dfs(i); for (i=0;i<=num;i++) for (j=0;j<LO;j++){ if (!t[i].t[j]){ u=t[i].f; while(!t[u].t[j]&&u) u=t[u].f; u=t[u].t[j]; }else u=t[i].t[j]; t[i].v[j]=u; } for (i=0;i<=n;i++) for (j=0;j<=num;j++) dp[i][j]=-1; dp[0][0]=0;ss[0][0]=""; for (i=0;i<n;i++) for (j=0;j<=num;j++) if (dp[i][j]!=-1) for (l=0;l<LO;l++) if ((dp[i+1][t[j].v[l]]<t[t[j].v[l]].q+dp[i][j])||(dp[i+1][t[j].v[l]]==t[t[j].v[l]].q+dp[i][j]&&ss[i+1][t[j].v[l]]>ss[i][j]+(char)(l+‘a‘))) dp[i+1][t[j].v[l]]=dp[i][j]+t[t[j].v[l]].q,ss[i+1][t[j].v[l]]=ss[i][j]+(char)(l+‘a‘); ans=0;str=""; for (i=0;i<=n;i++) for (j=0;j<=num;j++) if (dp[i][j]>ans||(dp[i][j]==ans&&(str.size()>ss[i][j].size()||(str.size()==ss[i][j].size()&&str>ss[i][j])))) ans=dp[i][j],str=ss[i][j]; cout<<str<<endl; for (i=0;i<=num;i++) for (j=0;j<LO;j++) t[i].t[j]=t[i].v[j]=0; for (i=0;i<=num;i++) t[i].q=t[i].f=0; } }
标签:
原文地址:http://www.cnblogs.com/Enceladus/p/5312274.html