题意:你有一个字符串, 有两种操作,一种是改变字符串,一种是某个用户询问这个字符串,如果一个用户每次查询字符串的时候都是他的用户名,他就会高兴。问最多有多少个用户会高兴?

题意:容易发现,在两个1操作之间,如果有多个用户的的询问,只能满足一个。换句话说,如果满足了其中的一个,那么其它的便不能满足。我们可以对所有两个1之间的操作两两连边,那么问题就变成了最大独立集问题。

对于这个问题,可以用状压DP解决,但是最多有40个不同的用户,所以需要分成两半,分别预处理,然后枚举其中的一半,在保证于这边一半不相交的情况下,找到对应的另一半。

代码:

#include <bits/stdc++.h>
using namespace std;
int f[1 << 20], g[1 << 20];
map<string, int> mp;
int G[50][50];
vector<int> v;
int cnt;
string s;
int main() {
int n, m, op;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &op);
if (op == 1) {
v.clear();
continue;
} else {
cin >> s;
if(!mp.count(s))
mp[s] = cnt++;
v.push_back(mp[s]);
for (int j = 0; j < v.size() - 1; j++)
G[v[j]][v[v.size() - 1]] = G[v[v.size() - 1]][v[j]] = 1;
}
}
if(v.size()) {
for (int j = 0; j < v.size() - 1; j++)
G[v[j]][v[v.size() - 1]] = G[v[v.size() - 1]][v[j]] = 1;
}
int s1 = m / 2;
int s2 = m - s1;
for (int i = 0; i < (1 << s1); i++) {
for (int j = 0; j < s1; j++) {
if(((i >> j) & 1) == 0) {
int flag = 1;
for (int k = 0; k < s1; k++) {
if((i >> k) & 1)
if(G[j][k] == 1) {
flag = 0;
break;
}
}
f[i | (1 << j)] = max(f[i | (1 << j)], f[i] + flag);
}
}
}
for (int i = 0; i < (1 << s2); i++) {
for (int j = 0; j < s2; j++) {
if(((i >> j) & 1) == 0) {
int flag = 1;
for (int k = 0; k < s2; k++) {
if((i >> k) & 1)
if(G[j + s1][k + s1] == 1) {
flag = 0;
break;
}
}
g[i | (1 << j)] = max(g[i | (1 << j)], g[i] + flag);
}
}
}
int ans = 0;
for (int i = 0; i < (1 << s1); i++) {
int now = (1 << s2) - 1;
for (int j = 0; j < s2; j++) {
for (int k = 0; k < s1; k++) {
if((i >> k) & 1)
if(G[k][j + s1] == 1) {
now ^= (1 << j);
break;
}
}
}
ans = max(ans, f[i] + g[now]);
}
printf("%d\n", ans);
}

  

Codeforces 1105E 最大独立集 状态DP 中途相遇法的更多相关文章

  1. Codeforces 525E Anya and Cubes 中途相遇法

    题目链接:点击打开链接 题意: 给定n个数.k个感叹号,常数S 以下给出这n个数. 目标: 随意给当中一些数变成阶乘.至多变k个. 再随意取一些数,使得这些数和恰好为S 问有多少方法. 思路: 三进制 ...

  2. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  3. uva 6757 Cup of Cowards(中途相遇法,貌似)

    uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...

  4. LA 2965 Jurassic Remains (中途相遇法)

    Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...

  5. HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))

    Difference Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  6. 高效算法——J 中途相遇法,求和

    ---恢复内容开始--- J - 中途相遇法 Time Limit:9000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Su ...

  7. 【UVALive】2965 Jurassic Remains(中途相遇法)

    题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...

  8. uva1152 - 4 Values whose Sum is 0(枚举,中途相遇法)

    用中途相遇法的思想来解题.分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度. 这里用到一个很实用的技巧: 求长度为n的有序数组a中的数k的个数num? num=upper_bound(a,a+ ...

  9. LA 2965 中途相遇法

    题目链接:https://vjudge.net/problem/UVALive-2965 题意: 有很多字符串(24),选出一些字符串,要求这些字符串的字母都是偶数次: 分析: 暴力2^24也很大了, ...

随机推荐

  1. 使用jquery.validate组件进行前端数据验证并实现异步提交前验证检查

    学习如鹏网掌上组的项目开发,使用到了前端验证,视频里使用的ValidateForm验证框架,但是我使用的Hui的框架中使用的是jquery.validate验证框架 所以自行学习jquery.vali ...

  2. jackson的readTree有坑

    {"}] readTree认为上面的字符是json,坑啊 alibaba的fastjson 无论JSONObject.parseObject还是JSONObject.parseObject ...

  3. 利用Navicat Premium连接Oracle数据库

    利用Navicat Premium连接Oracle数据库 Navicat premium是一款数据库管理工具,支持多种数据库,也非常轻量: 安装包准备:Navicat Premium_11.1.8简体 ...

  4. 【转载】MySQL查询当天0点,昨天时间

    转载自:https://blog.csdn.net/qq_22158021/article/details/78800299 今天是 SELECT NOW();-- 2015-09-28 13:48: ...

  5. 拓展练习部分---打包压缩 及 RPM工具

    目录 打包压缩部分 1.linux下常见的压缩包类型有哪些 rpm 工具部分 打包压缩部分 1.linux下常见的压缩包类型有哪些 .zip .gz 会删除源文件 .bz2 会删除源文件 .tar.g ...

  6. jcrop+java 后台

    //jcrop 用法 lpf //页面引入 //<link rel="stylesheet" href="${basePath}/scripts/jcrop/jqu ...

  7. TCP/IP的分层管理_01

    1.TCP/IP协议族里最重要的一点就是分层.TCP/IP协议族按层次分别分为以下4层:         应用层,传输层,网络层和数据链路层.           应用层:决定了向用户提供应用服务时通 ...

  8. ThreadLocal内存泄漏

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11421437.html 内存泄漏 内存泄漏是指不再使⽤的对象⽆法得到及时的回收,持续占⽤内存空间,从⽽ ...

  9. table 中 当前行变量的获取

  10. BlueStore-先进的用户态文件系统《一》

    https://zhuanlan.zhihu.com/p/45084771 分布式存储系统通过将数据分散到多台机器上来充分利用多台机器的资源提高系统的存储能力,每台机器上的数据存放都需要本地的单机存储 ...