跟 HDU 4057 Rescue the Rabbit差不多的AC自动机+dp,比赛的时候被虐成傻逼了!!!

999的状态不多,直接状态压缩就行。dp[i][ACstatus][status] 到字符串第i位置,在AC自动机上状态为ACstatus,包含到999的状态为status。

更新了一下自动机的模板。。。Orz简洁写法

View Code

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>#define CL(arr, val)    memset(arr, val, sizeof(arr))
#define REP(i, n)       for((i) = 0; (i) < (n); ++(i))
#define FOR(i, l, h)    for((i) = (l); (i) <= (h); ++(i))
#define FORD(i, h, l)   for((i) = (h); (i) >= (l); --(i))
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%lld\n", x)
#define Read()  freopen("data.in", "r", stdin)
#define Write() freopen("data.out", "w", stdout);typedef long long LL;
const double eps = 1e-6;
const double PI = acos(-1.0);
const int inf = 0x1F1F1F1F;using namespace std;const int N = 1610;struct node {int val;short type;bool cannot;short index;node *pre, *next[26];void init() {val = type = 0;index = cannot = 0;pre = NULL;memset(next, 0, sizeof(next));}
};node trie[N];
node *root, *q[N];int cnt, must;
int dp[2][N][1<<8];
int vv[2][N][1<<8];
char str[110];void insert(node* root, char* str, int val) {int c, i;for(i = 0; str[i] != 0; ++i) {c = str[i] - 'a';if(root->next[c] == 0) {root->next[c] = &trie[++cnt];root->next[c]->init();root->next[c]->index = cnt;}root = root->next[c];}if(val == 999) {root->type |= (1<<must++);} else if(val == -999) {root->cannot = 1;} else {root->val += val;}
}void buildAC() {int head, tail, i;node *u;root->pre = root;head = tail = 0;q[tail++] = root;while(head < tail) {u = q[head++];u->val += u->pre->val;u->type |= u->pre->type;u->cannot |= u->pre->cannot;for(i = 0; i < 26; ++i) {if(u->next[i] == 0) {if(u == root)   u->next[i] = root;else    u->next[i] = u->pre->next[i];} else {if(u == root)   u->next[i]->pre = root;else    u->next[i]->pre = u->pre->next[i];/*if(u->next[i]->pre->val)    u->next[i]->val += u->next[i]->pre->val;if(u->next[i]->pre->type)   u->next[i]->type |= u->next[i]->pre->type;if(u->next[i]->pre->cannot) u->next[i]->cannot = 1;*/q[tail++] = u->next[i];}}}
}void solve() {int i, j, k, c;int nxt, val, tt, n = strlen(str);CL(dp[1], 0x1f);CL(vv[1], 0);dp[1][0][0] = 0;vv[1][0][0] = 0;for(i = 0; i < n; ++i) {CL(dp[i&1], 0x1f);CL(vv[i&1], 0);for(j = 0; j <= cnt; ++j) {for(k = 0; k < (1<<must); ++k) {if(dp[(i+1)&1][j][k] >= inf)    continue;if(dp[i&1][j][k] > dp[(i+1)&1][j][k] + 1) {dp[i&1][j][k] = dp[(i+1)&1][j][k] + 1;vv[i&1][j][k] = vv[(i+1)&1][j][k];} else if(dp[i&1][j][k] == dp[(i+1)&1][j][k] + 1 && vv[i&1][j][k] < vv[(i+1)&1][j][k]) {vv[i&1][j][k] = vv[(i+1)&1][j][k];}c = str[i] - 'a';nxt = trie[j].next[c]->index;if(trie[nxt].cannot)    continue;val = trie[nxt].val;tt = k|trie[nxt].type;if(dp[i&1][nxt][tt] > dp[(i+1)&1][j][k]) {dp[i&1][nxt][tt] = dp[(i+1)&1][j][k];vv[i&1][nxt][tt] = vv[(i+1)&1][j][k] + val;} else if( dp[i&1][nxt][tt] == dp[(i+1)&1][j][k] &&vv[i&1][nxt][tt] < vv[(i+1)&1][j][k] + val) {vv[i&1][nxt][tt] = vv[(i+1)&1][j][k] + val;}}}}int ans1 = inf, ans2 = 0, full = (1<<must) - 1;for(j = 0; j <= cnt; ++j) {if(ans1 > dp[(n-1)&1][j][full]) {ans1 = dp[(n-1)&1][j][full];ans2 = vv[(n-1)&1][j][full];}if(ans1 == dp[(n-1)&1][j][full] && ans2 < vv[(n-1)&1][j][full]) {ans2 = vv[(n-1)&1][j][full];}}if(ans1 == inf)     puts("Banned");else    printf("%d %d\n", ans1, ans2);
}int main() {//freopen("data.in", "r", stdin);int T, n, g, cas = 0;scanf("%d", &T);while(T--) {root = &trie[0];root->init();cnt = must = 0;scanf("%d", &n);while(n--) {scanf("%s %d", str, &g);insert(root, str, g);}buildAC();scanf("%s", str);printf("Case %d: ", ++cas);solve();}return 0;
}

转载于:https://www.cnblogs.com/vongang/archive/2013/04/01/2993593.html

HDU 4534 郑厂长系列故事——新闻净化相关推荐

  1. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...

  2. hdu 4524 郑厂长系列故事——逃离迷宫

    点击打开链接 郑厂长系列故事--逃离迷宫                                                                               T ...

  3. hdu 4539 郑厂长系列故事——排兵布阵

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  4. HDU 4539 郑厂长系列故事――排兵布阵(状态压缩)

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  5. HDU 4539 郑厂长系列故事――排兵布阵

    /* 曼哈顿距离的定义是:两个点的坐标为(x1,y1),(x2,y2),两点的曼哈顿距离为|x1-x2|+|y1-y2| 题意:题上要求是两个士兵的距离不能是曼哈顿距离为2,意思就是这个点在同一行同一 ...

  6. hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地

    题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Other ...

  7. HDU4509 郑厂长系列故事——体检【水题】

    郑厂长系列故事--体检 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Sub ...

  8. 排兵布阵问题java语言_hdu 4539 郑厂长系列故事——排兵布阵

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  9. 郑厂长系列故事——排兵布阵 状态压缩DP

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

最新文章

  1. Struts1.x系列教程(4):标签库概述与安装
  2. 使用easyexcel导入时间数据转换成Data的坑
  3. .NET点滴:SpanT
  4. 自然语言处理中的Attention Model:是什么以及为什么[一]
  5. 沉痛哀悼在汶川特大地震中的遇难者!!!!!
  6. petshop4.0 详解之三(PetShop数据访问层之消息处理) [转]
  7. visio中虚线粘贴到word中变实线的解决办法(转)
  8. POI报表入门,excel,使用事件模型解析百万数据excel报表
  9. Lc123验证是不是回文序列
  10. [deviceone开发]-土地销售App开源
  11. 声音加速_听,这是加速的声音
  12. 学习webpack系列之一 ---- (手动部署环境)
  13. mac mini u盘安装系统_U盘安装系统教程
  14. Python解析xml文件详解
  15. 论文_毕业设计复现机器学习模型案例大本营(收藏)
  16. 利用网页内容监控来提升网站收录排名
  17. 写一个iOS复杂表单的正确姿势
  18. 2010-05-20 代码复用、使用率情况分析
  19. 计算机系统结构相关的论文,计算机系统结构毕业论文题目.doc
  20. AMBA之AHB总线

热门文章

  1. pip 指定版本安装
  2. Word字体修改(罚抄,抄作业专用)
  3. 【编辑器】Vim学习笔记
  4. java pdf 转txt文件怎么打开_使用iText将TXT文件转换为PDF(保留格式)
  5. 【BZOJ4318】OSU!【期望DP】
  6. Tricks Device 最短路+最大流
  7. python中对象和类的关系_Python面向对象之类与类之间的关系
  8. LeetCode解题思路—循环排序与原地翻转链表(思维导图)
  9. Codeforces Round #223 (Div. 2): C. Sereja and Prefixes(二分+递归)
  10. bzoj 3895: 取石子(博弈)