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

题意:容易发现,在两个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. STM8硬件设计注意事项

    1.中断 STM8的外部中断和STM32不一样,每个端口PX只有1个中断 2.ADC 1)Additional AIN12 analog input is not selectable in ADC ...

  2. 最大公因数数gcd模板

    首先蒟蒻是在大佬的博客里学习的代码,代码风格多有相似之处,大佬博客https://www.cnblogs.com/lMonster81/p/10433902.html 最大公因数那,顾名思义就是两个数 ...

  3. JAVA 输入输出程序开发

    参考: java中 静态方法和非静态方法的区别 字符流的输入和输出 java文件创建.删除.读取.写入操作大全 Java键盘输入并且写入文件 File类的isDiretory Java统计子串在字符串 ...

  4. SQL Server 管理套件(SSMS)

    SQL Server 管理套件(SSMS) 当您按照之前章节的步骤顺利安装完 SQL Server 2014 后,要做的第一件事就是需要打开 SQL Server 管理套件,并且要知道怎样去使用它. ...

  5. 【纪中集训】2019.08.02【NOIP提高组】模拟 A 组TJ

    \(\newcommand{\RNum}[1]{\uppercase\expandafter{\romannumeral #1\relax}}\) T1 一道可以暴力撵标算的题-- Descripti ...

  6. AcWing 226. 233矩阵 (矩阵快速幂+线性递推)打卡

    题目:https://www.acwing.com/problem/content/228/ 题意:有一个二维矩阵,这里只给你第一行和第一列,要你求出f[n][m],关系式有    1,  f[0][ ...

  7. dos添加文件夹属性!

    attrib 显示所有文件的属性:参数:+r或-r [文件名] 设置文件属性是否为只读 +h或-h [文件名] 设置文件属性是否隐含 +s或-s [文件名] 设置文件属性是否为系统文件 +a或-a [ ...

  8. PHP基础知识总结(四) 留言板例子 知识应用

    1.留言板显示页面:note.php <?php $host = "127.0.0.1"; $user = "root"; $pwd = "zs ...

  9. 编译安装Python3.4, pip安装, pypi是pip的源,修改为国内的pypi源

    Linux 下编译安装 Python 3.4 更新于 2014-09-24 02:01:05 UEANER 系统环境: CentOS 6.5 x86_64 / Fedora 20 x86_64 安装相 ...

  10. datetime timestamp使用

    #coding=utf-8 import time import datetime def yes_time(): #获取当前时间 now_time = datetime.datetime.now() ...