博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 1009G Allowed Letters 最大流转最小割 sosdp
阅读量:5094 次
发布时间:2019-06-13

本文共 2120 字,大约阅读时间需要 7 分钟。

最直观的想法是贪心取, 然后网络流取check可不可行, 然后T了。

想到最大流可以等于最小割, 那么我们状压枚举字符代表的6个点连向汇点是否断掉,

然后再枚举64个本质不同的位置, 是否需要切段原点联想它的边, 单次check复杂度64 * 64

用sosdp能优化到64 * 6

#include
#define LL long long#define LD long double#define ull unsigned long long#define fi first#define se second#define mk make_pair#define PLL pair
#define PLI pair
#define PII pair
#define SZ(x) ((int)x.size())#define ALL(x) (x).begin(), (x).end()using namespace std;const int N = 2e5 + 7;const int inf = 0x3f3f3f3f;const LL INF = 0x3f3f3f3f3f3f3f3f;const int mod = 1e9 + 7;const double eps = 1e-8;const double PI = acos(-1);template
inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;}template
inline void sub(T& a, S b) {a -= b; if(a < 0) a += mod;}template
inline bool chkmax(T& a, S b) { return a < b ? a = b, true : false;}template
inline bool chkmin(T& a, S b) { return a > b ? a = b, true : false;}int n, m, mask[N], c[N], cnt[N], sos[N];char s[N], t[N], ans[N];bool check() { int sum = 0, ret = inf; for(int i = 0; i < 6; i++) sum += c[i]; for(int i = 0; i < 64; i++) sos[i] = cnt[i]; for(int i = 0; i < 6; i++) for(int j = 0; j < 64; j++) if(j >> i & 1) sos[j] += sos[j ^ (1 << i)]; for(int s1 = 0; s1 < 64; s1++) { int tmp = 0; for(int i = 0; i < 6; i++) if(s1 >> i & 1) tmp += c[i]; tmp += sum - sos[s1]; chkmin(ret, tmp); } return sum == ret;}inline int getId(char c) { return c - 'a';}int main() { scanf("%s", s + 1); n = strlen(s + 1); for(int i = 1; i <= n; i++) c[getId(s[i])]++; scanf("%d", &m); while(m--) { int p; scanf("%d%s", &p, t + 1); for(int i = 1; t[i]; i++) mask[p] |= 1 << getId(t[i]); } for(int i = 1; i <= n; i++) { if(!mask[i]) mask[i] = 63; cnt[mask[i]]++; } for(int i = 1; i <= n; i++) { bool flag = false; for(int j = 0; j < 6; j++) { if(c[j] && mask[i] >> j & 1) { c[j]--; cnt[mask[i]]--; flag = check(); if(flag) { ans[i] = 'a' + j; break; } c[j]++; cnt[mask[i]]++; } } if(!flag) return puts("Impossible"), 0; } ans[n + 1] = '\0'; puts(ans + 1); return 0;}/**/

 

转载于:https://www.cnblogs.com/CJLHY/p/10727182.html

你可能感兴趣的文章
反ring3 hook demo ,直接从dll文件修复 dll的code段,实现反hook
查看>>
soa---java 多线程的---锁
查看>>
【算法】普通方法和筛选法求素数
查看>>
Linux在出现/java: cannot execute binary file
查看>>
Linux守护进程的编程实现
查看>>
POJ读书笔记2.1 —— 鸡兔笼带
查看>>
转载--Github优秀java项目集合(中文版) - 涉及java所有的知识体系
查看>>
公司内网机器vm ubuntu proxy 设置
查看>>
Android2.1--如何在android模拟器上安装与删除.APK文件
查看>>
聚类分析二:DBSCAN算法
查看>>
高级c++头文件bits/stdc++.h
查看>>
【LeetCode】347-前K个高频元素
查看>>
置换元素与不可置换元素
查看>>
非root用户安装java版本
查看>>
css引用与html语义化
查看>>
luoguP3723 HNOI2017 礼物
查看>>
HDU 1269 裸奔的强联通分量
查看>>
[推荐]WebService开发知识介绍
查看>>
centos6.8下安装dc2012
查看>>
javascript设计模式之发布订阅模式
查看>>