[AC自动机+dp+记录路径] hdu 2825 Ring
来源:互联网 发布:傲剑丹田升级数据一游 编辑:程序博客网 时间:2024/05/01 03:23
题意:
给N个长度,M个单词,每个单词有权值
输出长度不大于N的权值和最大的单词
代价相同输出长度短的,长度相同输出字典序最小
思路:
开一个字符串数组,暴力存储每个节点的单词!
其他思路和dp都一样
注意:如果和为零的话输出空串。
代码:
#include"cstdlib"#include"cstdio"#include"cstring"#include"cmath"#include"queue"#include"algorithm"#include"iostream"using namespace std;int triecont;char fuck[55][1234][55];struct word{ char x[12]; int k;} w[123];struct trie{ int mark,id; trie *next[27],*fail; trie() { mark=id=0; memset(next,0,sizeof(next)); fail=NULL; }};trie *root,*node[2340];void init(char *v,int k){ trie *p=root; for(int i=0;v[i];i++) { int tep=v[i]-'a'; if(p->next[tep]==NULL) { p->next[tep]=new trie(); node[triecont]=p->next[tep]; p->next[tep]->id=triecont++; } p=p->next[tep]; } p->mark+=k;}void getac(){ queue<trie*>q; q.push(root); while(!q.empty()) { trie *p=q.front(); q.pop(); for(int i=0;i<26;i++) { if(p->next[i]==NULL) { if(p==root) p->next[i]=root; else p->next[i]=p->fail->next[i]; } else { if(p==root) p->next[i]->fail=root; else p->next[i]->fail=p->fail->next[i]; q.push(p->next[i]); if(p!=root) p->next[i]->mark+=p->next[i]->fail->mark; } } }}int cmp(char *a,char *b){ int len1=strlen(a); int len2=strlen(b); if(len1!=len2) { if(len1<len2) return 1; return 0; } else { if(strcmp(a,b)<0) return 1; return 0; }}int dp[55][1234];int main(){ int t; cin>>t; while(t--) { int n,m; scanf("%d%d",&n,&m); memset(node,0,sizeof(node)); triecont=0; root=new trie(); node[triecont]=root; root->id=triecont++; for(int i=0; i<m; i++) scanf("%s",w[i].x); for(int i=0; i<m; i++) scanf("%d",&w[i].k); for(int i=0; i<m; i++) { init(w[i].x,w[i].k); } getac(); memset(dp,-1,sizeof(dp)); dp[0][0]=0; char ans[55]; strcpy(fuck[0][0],""); strcpy(ans,""); int Max=0; for(int i=1;i<=n;i++) { for(int j=0;j<triecont;j++) { if(dp[i-1][j]==-1) continue; for(int k=0;k<26;k++) { trie *p=node[j]->next[k]; int sum=dp[i-1][j]+p->mark; char tep[55]; strcpy(tep,fuck[i-1][j]); int len=strlen(tep); tep[len]='a'+k; tep[len+1]='\0'; if(sum>dp[i][p->id] || (sum==dp[i][p->id] && cmp(tep,fuck[i][p->id]))) { dp[i][p->id]=sum; strcpy(fuck[i][p->id],tep); if(sum>Max || (sum==Max && cmp(tep,ans))) { Max=sum; strcpy(ans,tep); } } } } } puts(ans); } return 0;}
0 0
- [AC自动机+dp+记录路径] hdu 2825 Ring
- hdu 2296 AC自动机+dp+路径记录
- HDU 2296 Ring(AC自动机 + DP 记录方案)
- AC自动机+dp打印路径 hdu2296 Ring
- HDU 2296 Ring(AC自动机+DP)
- HDU 2296 Ring(AC自动机+DP)
- HDU 2296 Ring(AC自动机+DP)
- 【HDU】2296 Ring AC自动机+DP
- hdu 2296 Ring(AC自动机+DP)
- hdu 2296 Ring AC自动机+DP
- hdu 2296 Ring (ac自动机+dp)
- HDU 2296 Ring(AC自动机+dp)
- HDU 2296 Ring (AC自动机 + DP)
- 【hdu 2296】 Ring AC-自动机+DP
- hdu 2296 Ring AC自动机+DP
- hdu 2296 Ring(AC自动机+DP)
- HDU 2296 Ring (AC自动机+DP)
- HDU 2296-Ring(AC自动机+DP)
- hdu 4975 最大流快版
- android 分割线渐变色和几种颜色值定义
- android 图片压缩
- 关于出现在服务器中配置的web,用浏览器打开出现关闭按钮消失或者字体马赛克乱码的问题
- 深入理解Java中的final关键字
- [AC自动机+dp+记录路径] hdu 2825 Ring
- 关于联合体union的详细解释
- Long Jumps
- jstack和线程dump分析
- 深入理解计算机系统 习题 1
- 如何用掌沃WiFi商盟制作免费的微信点菜系统
- 第三章 栈和队列 思维导图
- JMX连接tomcat(一)window篇
- jetty8 POST FORM 大小限制