HDU 4534 郑厂长系列故事——新闻净化
跟 HDU 4057 Rescue the Rabbit差不多的AC自动机+dp,比赛的时候被虐成傻逼了!!!
999的状态不多,直接状态压缩就行。dp[i][ACstatus][status] 到字符串第i位置,在AC自动机上状态为ACstatus,包含到999的状态为status。
更新了一下自动机的模板。。。Orz简洁写法
![](/assets/blank.gif)
![](/assets/blank.gif)
#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 郑厂长系列故事——新闻净化相关推荐
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...
- hdu 4524 郑厂长系列故事——逃离迷宫
点击打开链接 郑厂长系列故事--逃离迷宫 T ...
- hdu 4539 郑厂长系列故事——排兵布阵
郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- HDU 4539 郑厂长系列故事――排兵布阵(状态压缩)
郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- HDU 4539 郑厂长系列故事――排兵布阵
/* 曼哈顿距离的定义是:两个点的坐标为(x1,y1),(x2,y2),两点的曼哈顿距离为|x1-x2|+|y1-y2| 题意:题上要求是两个士兵的距离不能是曼哈顿距离为2,意思就是这个点在同一行同一 ...
- hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地
题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Other ...
- HDU4509 郑厂长系列故事——体检【水题】
郑厂长系列故事--体检 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Sub ...
- 排兵布阵问题java语言_hdu 4539 郑厂长系列故事——排兵布阵
郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- 郑厂长系列故事——排兵布阵 状态压缩DP
郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
最新文章
- Struts1.x系列教程(4):标签库概述与安装
- 使用easyexcel导入时间数据转换成Data的坑
- .NET点滴:SpanT
- 自然语言处理中的Attention Model:是什么以及为什么[一]
- 沉痛哀悼在汶川特大地震中的遇难者!!!!!
- petshop4.0 详解之三(PetShop数据访问层之消息处理) [转]
- visio中虚线粘贴到word中变实线的解决办法(转)
- POI报表入门,excel,使用事件模型解析百万数据excel报表
- Lc123验证是不是回文序列
- [deviceone开发]-土地销售App开源
- 声音加速_听,这是加速的声音
- 学习webpack系列之一 ---- (手动部署环境)
- mac mini u盘安装系统_U盘安装系统教程
- Python解析xml文件详解
- 论文_毕业设计复现机器学习模型案例大本营(收藏)
- 利用网页内容监控来提升网站收录排名
- 写一个iOS复杂表单的正确姿势
- 2010-05-20 代码复用、使用率情况分析
- 计算机系统结构相关的论文,计算机系统结构毕业论文题目.doc
- AMBA之AHB总线
热门文章
- pip 指定版本安装
- Word字体修改(罚抄,抄作业专用)
- 【编辑器】Vim学习笔记
- java pdf 转txt文件怎么打开_使用iText将TXT文件转换为PDF(保留格式)
- 【BZOJ4318】OSU!【期望DP】
- Tricks Device 最短路+最大流
- python中对象和类的关系_Python面向对象之类与类之间的关系
- LeetCode解题思路—循环排序与原地翻转链表(思维导图)
- Codeforces Round #223 (Div. 2): C. Sereja and Prefixes(二分+递归)
- bzoj 3895: 取石子(博弈)