AC自动机+状压DP,这个相当明显

状态设置为dp[len][u][st]表示在自动机内走了len步后,位于结点u,经过的pattern的状态为st时,所能取得的最大value。

然后就很容易得出状态方程了。

这里需要用到滚动数组,否则MLE。

刚开始用的是递归的方式写的,坑了2炮,最后没办法,只能改成迭代写。

因为平时迭代写的不多,所以改得比较慢,调了好久才过,这里以后需要注意!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int sigma=4;
const int maxn=1010;
const int inf=1<<30;
int ch[maxn][sigma],val[maxn];
int sz;
void init(){sz=1;memset(ch[0],0,sizeof(ch[0]));}
int idx(char c)
{if(c=='A') return 0;else if(c=='T') return 1;else if(c=='G') return 2;else return 3;
}
void insert(char *s,int v)
{int u=0,n=strlen(s);for(int i=0;i<n;i++){int c=idx(s[i]);if(!ch[u][c]){memset(ch[sz],0,sizeof(ch[sz]));val[sz]=0;ch[u][c]=sz++;}u=ch[u][c];}val[u]|=(1<<v);
}
int f[maxn];
void getfail()
{queue<int> q;f[0]=0;for(int c=0;c<sigma;c++){int u=ch[0][c];if(u){f[u]=0;q.push(u);}}while(!q.empty()){int r=q.front();q.pop();for(int c=0;c<sigma;c++){int u=ch[r][c];if(!u){ch[r][c]=ch[f[r]][c];continue;}q.push(u);int v=f[r];while(v && !ch[v][c]) v=f[v];f[u]=ch[v][c];val[u]|=val[f[u]];}}
}
int n,l;
int w[20],v[1<<12];
char str[maxn];
int dp[2][1010][1<<10];
void getval()
{for(int i=0;i<(1<<n);i++){v[i]=0;for(int j=0;j<n;j++) if(i&(1<<j)) v[i]+=w[j];}
}
int main()
{//freopen("data","r",stdin);while(~scanf("%d%d",&n,&l)){memset(val,0,sizeof(val));init();for(int i=0;i<n;i++){scanf("%s%d",str,&w[i]);insert(str,i);}getval();getfail();//for(int i=0;i<sz;i++) cout<<i<<" "<<val[i]<<endl;int flag=0;for(int i=0;i<sz;i++)for(int st=0;st<(1<<n);st++) dp[flag][i][st]=-inf;dp[0][0][0]=0;for(int i=0;i<=l;i++){for(int j=0;j<sz;j++)for(int st=0;st<(1<<n);st++) dp[flag^1][j][st]=-inf;for(int j=0;j<sz;j++){for(int st=0;st<(1<<n);st++){for(int k=0;k<4;k++){int &tmp=dp[flag^1][ch[j][k]][st|val[j]];tmp=max(tmp,dp[flag][j][st]+v[val[j]&(~st)]);}}}flag^=1;}int ans=-inf;for(int i=0;i<sz;i++)for(int st=0;st<(1<<n);st++){ans=max(ans,dp[flag][i][st]);}if(ans<0) puts("No Rabbit after 2012!");else printf("%d\n",ans);}return 0;
}

trainging contest#1(2011大连现场赛)G BY bly相关推荐

  1. trainging contest#1(2011大连现场赛)C BY bly

    需要推出一个很奇妙的性质,知道了这个性质之后这道题就是道简单区间dp了. 就是一段区间[i,j]必须从2个端点之一开始按,仔细想想确实是这样的,比赛的时候贪心不出dp顺序,还以为是搜索(还是思维太弱了 ...

  2. trainging contest#1(2011大连现场赛)I BY bly

    先因式分解,记录所有的因子 然后直接容斥即可,四次方和公式:n*(n+1)*(2*n+1)*(3*n^2+3*n-1)/30 #include <iostream> #include &l ...

  3. trainging contest#2(2011成都现场赛)G BY bly

    一道AC自动机+DP,因为单词可能重复,所以记录结点信息的需要是以个vector,然后dp的时候需要递归的更新dp值,因为一个结点可能为多个单词的结尾. #include <iostream&g ...

  4. trainging contest#2(2011成都现场赛)D BY bly

    这种dp其实不算难,状态什么的都不难想,就是需要用SPFA写,不然就会莫名奇妙的WA 昨天用dp写,怎么改都是WA,确切的说应该说是记忆化搜就WA 今天改成用SPFA就过了,还有我把堆优化的dij和S ...

  5. trainging contest#2(2011成都现场赛)A BY bly

    额,这题我想了半场也没有想出来,思维是硬伤-- 比赛的时候只是想到了,减1和合并都只算一个操作数,唯一的例外是减掉一个1时,算两个操作数. 于此同时减去最后一个1时只算一个操作数. 设状态为dp[i] ...

  6. 【2019南昌邀请赛现场赛 - G】Winner(建图,tarjan缩点 或 贪心)

    题目大意: n个人参加竞技比赛.比赛由三种模式a,b,c,每个人在每种模式下有对应的权值a[i]b[i]c[i].举行n−1场比赛,每场比赛主办方可以选择两个人决斗,能力值低的人淘汰.这样保证n-1场 ...

  7. 2011东北地区赛G题(二分-网络流判可行性)

    题意:从M个参赛选手中选一些人参加N轮比赛,每场比赛只能有一个人胜出,问如何安排比赛,让获胜最多的那个人获胜次数最少. 构图:二分次数,用最大流判可行性. 源点向参赛人员连容量为该参赛人员最多获胜次数 ...

  8. 【2019南昌邀请赛现场赛 - G】Winner(思维、图论+缩点)

    题目链接: https://nanti.jisuanke.com/t/40259" Ichuan really likes to play games, so he organized a ...

  9. 2017ACM-ICPC北京区域现场赛 G题 hihocoder1633

    传送门:点击打开链接 题意:一个N*N的网格,从左下角走到右上角需要的最短步数.要求不能经过# 而且路径不能经过一个三角形的内部,可以沿边走. 分析:计算几何题里不算难题,但若没想到坑点就一直卡题了. ...

最新文章

  1. 用PaddlePaddle打比赛!
  2. 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)
  3. vivado与modelsim的联合仿真(二)
  4. python绘图实例-Python matplotlib基础绘图函数示例
  5. 个人思考与研究:道德经(二)
  6. 化整为零,一步一步教你搭建Prometheus监控报警系统
  7. Python(88)_双下划线方法
  8. 查找列表元素的最大最小值(python)
  9. PHP+Mysql高仿百度知道签到源码演示与下载
  10. 原生JS实现苹果菜单
  11. url 特殊字符 传递参数解决方法
  12. mybatis plus 导出sql_软件更新丨mybatis-plus 3.0.7 发布,辞旧迎新
  13. 计算机没有cpu会怎么样,电脑cpu不好会怎么样
  14. 5G 时代,将边缘计算进行到底!
  15. 前端与移动开发之vue-day3(4)
  16. 老虎ji 剪枝模拟
  17. 服务器真在运行中,win7电脑服务器正在运行中的解决教程
  18. 手写数字识别中多元分类原理_如何验签名真伪?法大大手写签名识别功能来了!...
  19. 深度linux 1050ti,Archlinux安装NVIDIA1050Ti显卡驱动
  20. 使用135编辑器HTML样式,135编辑器滑动样式全教程!

热门文章

  1. 清除浏览器操作—JavaWeb网页刷新
  2. Linux访问Windows7共享文件夹
  3. RSA大会2010信息安全国际论坛
  4. ELK日志平台搭建(一)
  5. 基于kubernetes平台的CICD持续集成
  6. 【年度总结】回望大学四年坎坷的2022
  7. 大疆口袋相机美颜怎么设置_大疆(DJI)Pocket2 | 深度测评口袋相机:超多配件随心搭,自带美颜的拍摄助手!-极果...
  8. 漏洞介绍及修复建议(漏洞汇总,建议收藏后期会不断更新)
  9. sudo漏洞修复升级
  10. 2017年8月22日 星期二