100道动态规划——29 UVALive 5766 GRE Words AC自动机上的动态规划
来源:互联网 发布:udid授权软件 编辑:程序博客网 时间:2024/06/06 12:27
之前怎么写都是WA,空了一天写还是WA,把cin和cout都换成scanf和printf就过,奇怪的问题
定义状态dp[i]表示选择第i个串的最大价值
状态转移方程就是 dp[i]=max{dp[j]}+value[i],其中要求0<=j<i,且串j是串i的子串
因此问题就归结于高效判断子串的问题,这要求我们把每一个串都保存下来,当然,你记录每个点的father也行
然后每次对于串i,就在AC自动机上扫它的子串
代码里rec[i]表示第i个串的最后一个字符在AC自动机上的节点位置
#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int maxm=3E5+5;int times,ans,kcase,sz,root,n,ch[maxm][26],fail[maxm],last[maxm],dp[maxm],v[maxm],rec[20005],val[20005],pos[20005],newnode();char str[maxm];void getfail(),ins(int k),init();int main(){// ios_base::sync_with_stdio(false); scanf("%d",×); while(times--){ scanf("%d",&n); //cin>>n; init(); for(int i=0;i<n;++i){ scanf("%s%d",str+pos[i],&val[i]); pos[i+1]=pos[i]+strlen(str+pos[i]); //cin>>str[i]; ins(i); //cin>>val[i]; } getfail(); for(int i=0,u=root,p;i<n;++i,u=root) if(val[i]>0){ for(int j=pos[i];j<pos[i+1];++j){ p=u=ch[u][str[j]]; if(!v[p]&&last[p]!=root) p=last[p]; while(v[p]){ dp[rec[i]]=max(dp[rec[i]],dp[p]); p=last[p]; } } dp[rec[i]]+=val[i]; ans=max(ans,dp[rec[i]]); }// for(int i=0;i<n;++i)// cout<<dp[rec[i]]<<' '; printf("Case #%d: %d\n",++kcase,ans);// cout<<"Case #"<<++kcase<<": "<<ans<<endl; } return 0;}void init(){ sz=ans=0; root=newnode();}void ins(int k){ int u=root; for(int i=pos[k];str[i];++i){ str[i]-='a'; if(ch[u][str[i]]==root) ch[u][str[i]]=newnode(); u=ch[u][str[i]]; } v[u]=1; rec[k]=u;}void getfail(){ queue<int> q; for(int i=0;i<26;++i) if(ch[root][i]!=root){ q.push(ch[root][i]); fail[ch[root][i]]=last[ch[root][i]]=root; } int u; while(!q.empty()){ u=q.front();q.pop(); for(int i=0;i<26;++i) if(ch[u][i]==root) ch[u][i]=ch[fail[u]][i]; else{ fail[ch[u][i]]=ch[fail[u]][i]; last[ch[u][i]]=(v[fail[ch[u][i]]]?fail[ch[u][i]]:last[fail[ch[u][i]]]); q.push(ch[u][i]); } }}int newnode(){ dp[sz]=v[sz]=0; memset(ch[sz],0,sizeof ch[sz]); return sz++;}
0 0
- 100道动态规划——29 UVALive 5766 GRE Words AC自动机上的动态规划
- 100道动态规划——30 UVAlive 3907 Puzzle AC自动机上的动态规划,记忆化搜索
- pku1625 AC自动机,动态规划
- 【AC自动机】基于自动机状态设计的动态规划
- POJ3691 DNA repair AC自动机+动态规划
- HDU 2296 Ring AC自动机 + 动态规划
- UVA 11468 Substring(AC自动机+树上的动态规划)
- 【Luogu3041】视频游戏的连击(AC自动机,动态规划)
- 100道动态规划——28 POJ 2778 DNA Sequence AC自动机+DP+矩阵快速幂 很不错嘛
- [HDOJ 2243] 考研路茫茫——单词情结 [AC自动机+动态规划+矩阵加速]
- HDU 3962 / HIT 3045 Microgene--ac自动机 动态规划
- 动态规划和字符串匹配(KMP、AC自动机)
- POJ 1625 Censored! AC自动机 + 动态规划 + 高精度
- HDU 2457 DNA repair AC自动机 + 动态规划
- 【BZOJ2553】【BeiJing2011】禁忌 AC自动机 矩阵乘法 动态规划
- bzoj 3530: [Sdoi2014]数数 AC自动机&动态规划
- bzoj 1030: [JSOI2007]文本生成器 AC自动机+动态规划
- 动态规划第五讲——leetcode上的题目动态规划汇总(上)
- 程序员发展之路
- GetVersionEx函数
- SQL 到 mongo的对应表
- boost::format常用用法
- fedora20 安装samba服务
- 100道动态规划——29 UVALive 5766 GRE Words AC自动机上的动态规划
- Linux-top命令使用总结
- stanford cs231n 课程学习
- HDU 1201 18岁生日
- 苹果手机自动默认长数字为手机号,调用拨号程序
- 新手逆袭!记我的第一次系统开发
- ALV在标准按钮上增加自定义按钮,并实现文本及功能互相切换
- arm工作状态-arm状态和thumb状态
- sublime text 快捷键整理