hdu 4117 GRE Words 11年成都现场赛
来源:互联网 发布:什么影视cms好 编辑:程序博客网 时间:2024/05/14 15:18
离线建树,然后按顺序把值插入,每插入一个值的时候就按着fail算出该节点的最优解。
一个优化,那些值小于0的节点直接去掉,这个代码不能保证ac,因为这个做法上界很高,但是这题貌似数据随机生成,偶尔能够ac。。。
这个题目正解的话,是要加上线段树来优化这个做法的,因为按照fail指针可以构造出一棵树,算最优解的过程就变成不断更新节点的所有孩子值,求节点的最大值。
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int maxn=3e5+9,N=26,root=0,maxm=2e4+9;int cas=0;int lon;struct{ int next[N],tmp,fail;}trie[290000];void clr(int t){ for(int i=0;i<N;i++) trie[t].next[i]=0; trie[t].tmp=trie[t].fail=0;}void trieini(){ clr(0); lon=0;}void insert(char s[]){ int t=root; int n=strlen(s+1); for(int i=1;i<=n;i++) { if(trie[t].next[s[i]-'a']==0) { trie[t].next[s[i]-'a']=++lon; clr(lon); } t=trie[t].next[s[i]-'a']; }}void getfail(){ queue <int> q; q.push(root); while(!q.empty()) { int t=q.front(); q.pop(); for(int i=0;i<N;i++) if(trie[t].next[i]) { int u=trie[t].next[i]; int tmp=trie[t].fail; while(tmp!=root&&trie[tmp].next[i]==0) tmp=trie[tmp].fail; trie[u].fail=trie[tmp].next[i]; if(t==root) trie[u].fail=root; q.push(u); } }}int a[maxm];char s[maxn+21111];void solve(int top,int n){ int now=1; for(int i=1,t=root,ret=0,u;now<=n;i++) { if(s[i]=='#') { trie[t].tmp=ret+a[now]; now++; ret=0; t=root; continue; } t=trie[t].next[s[i]-'a']; u=t; while(u!=root) { ret=max(ret,trie[u].tmp); u=trie[u].fail; } } int ans=0; for(int i=1;i<=lon;i++) ans=max(ans,trie[i].tmp); printf("Case #%d: %d\n",++cas,ans);}int main(){// freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--) { trieini(); int n,top=0,m; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s %d",s+1+top,&a[i]); if(a[i]<0) { i--; n--; continue; } insert(s+top); m=strlen(s+1+top); top+=m; s[++top]='#'; } getfail(); solve(top,n); } return 0;}
- hdu 4117 GRE Words 11年成都现场赛
- HDU 4117 GRE Words (AC自动机 + 线段树优化DP) 2011年成都现场赛G题
- HDU 4787 GRE Words Revenge 分块式在线AC自动机 2013年成都现场赛G题
- HDU 4111 Alice and Bob (博弈)11年成都现场赛
- 【Hdu 4117】GRE Words
- hdu 4466 Triangle (12年成都区域现场赛c题)(dp+组合数学)
- HDU 4119 Isabella's Message (2011年成都赛区现场赛I题)
- HDU 4118 Holiday's Accommodation (2011年成都赛区现场赛H题)
- HDU 4115 Eliminate the Conflict (2011年成都赛区现场赛E题)
- HDU 5118 GRE Words Once More!(2014亚洲区北京站现场赛)
- 2-sat(2011年成都现场赛)
- HDU4465_12年成都现场赛B——Candy
- 12年成都现场赛K_Yet Another Multiple Problem
- 11年成都网络赛
- HDU 4038 Stone(11年成都网络赛-H题-贪心)
- HDU 4031 Attack(11年成都 线段树)
- HDU 4034 Graph(11年成都 Floyd运用)
- 11年成都 A 博弈论+记忆化搜索 HDU 4111
- UIView设置背景图片的方法
- SVN服务器搭建和使用(三)
- Android broadcast 相同优先级的顺序
- java破解ip屏蔽+多线程同步拨号-【多线程数据采集之五】
- TortoiseSVN客户端重新设置用户名和密码
- hdu 4117 GRE Words 11年成都现场赛
- javah
- 在altibase的linux下使用./abc.sh yonghuming来统计表空间的方法
- BOM和DOM
- Android应用开发中的风格和主题(style,themes)
- 清理mysql日志
- C#中Split分隔字符串的应用(C#、split、分隔、字符串)
- Linux下which、whereis、locate、find 命令的区别
- Java RMI网络编程开发之一 JAVA“进程间”通信方式