LA 2965 Jurassic Remains / 中途相遇法

2024-06-15 12:08

本文主要是介绍LA 2965 Jurassic Remains / 中途相遇法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

求尽量多的字符串 每种大写字母出现偶数次

每个字符串可以看成一个长度为26 出现奇数次对应位置为1 偶数为0

就是求一些字符串 他们的异或为0

n最大为24

2^24超时

可以枚举前一半n/2所以的子集 存在map里

然后枚举后一半看是否有和它相同的 相同的异或就为0

枚举一半时间可以接受

#include <cstdio>
#include <cstring>
#include <map>
using namespace std;const int maxn = 30;
map <int, int> table;
int n, a[maxn];int bitcount(int x)
{return x == 0 ? 0 : bitcount(x/2) + (x&1);
}
int main()
{char s[1000];while(scanf("%d", &n) == 1 && n){for(int i = 0; i < n; i++){a[i] = 0;scanf("%s", s);for(int j = 0; s[j]; j++)a[i] ^= (1<<(s[j]-'A'));}int n1 = n/2;int n2 = n-n1;table.clear();for(int i = 0; i < (1<<n1); i++)//前半 枚举了所有n1个元素的子集 {int x = 0;for(int j = 0; j < n1; j++){if(i & (1<<j))x ^= a[j];}if(!table.count(x) || bitcount(table[x]) < bitcount(i))//bitcount求i的2进制中1的个数 table[x] = i;}int ans = 0;for(int i = 0; i < (1<<n2); i++){int x = 0;for(int j = 0; j < n2; j++){if(i & (1<<j))x ^= a[n1+j];}if(table.count(x) && bitcount(ans) < bitcount(table[x]) + bitcount(i))ans = (i<<n1)^table[x];}printf("%d\n", bitcount(ans));for(int i = 0; i < n; i++){if(ans & (1<<i))printf("%d ", i+1);}printf("\n");}return 0;
}


 

这篇关于LA 2965 Jurassic Remains / 中途相遇法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063408

相关文章

UVa 1362(LA 3516) Exploring Pyramids

依旧是《训练指南》上的一道例题。思路大致相同,即设有一个序列S(i),S(i+1),S(i+2)...S(j),d[i,j]为所求的解。当S(i)==S(k),i<k<=j 时,说明在k回到根,那么S(i+1)...S(k-1)构成一棵独立的子树(当然也可能并不是子树)。那么d[i,j]就要加上d[i+1,k-1]*d[k,j],不断递增k,每遇到一个k,d[i,j]+=d[i

LA 3211 Now or later / 2-SAT

每架飞机只能在E L 这2个时间点降落 每2架并且降落的时间间隔必须大于等于p才算安全 目标使p尽量大 二分时间间隔 做2-SAT 有解说明可行 xi = true 表示选择E  false 选择L 如果 abs(Ei - Ej) < p (p 是当前二分到的值) 那么 1.选择了Ei 必须选择Lj 2.选择了Ej 必须选择Li 建图 上模版 #include <cstdio>#in

LA 3641 Leonardo's Notebook / 置换

给出26个大写字母组成 字符串B问是否存在一个置换A使得A^2 = B 书上的证明结论 2个长度为n的相同循环相乘 n为奇数时结果为1个长度为n的循环 n为偶数时分裂成2个长度为n/2的循环 倒过来 对于一个长度为n为奇数的循环B都能找到一个长度为n的循环A使得A^2 = B 对应任意2个长度为n的不相交循环B,C 都能找到一个长度为2n的循环A 使得A^2 = BC 所以对于B=(1,

LA 3905 Meteor / 区间扫描

求哪一时刻 框框里的点最多 每个点在做运动(在边框上不算) 求出每个点经过框框的区间 在2维坐标系以x表示 是开区间 因为区间边上不算 假设有一条竖线从左到右扫描过去 也就是求哪一时刻扫描线相交的区间最多 可以设cnt = 0每遇到左区间++右区间--求最大的cnt 然后一个区间右端点与一个区间的左区间相同 要先算右区间因为是开区间 书上的代码 #include <cstdio>#i

POJ-2965-The Pilots Brothers' refrigerator-2013-12-05 11:18:12

The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 16671 Accepted: 6327 Special Judge Description The game “The Pilots Brothers: following the st

[Linux] Screen的简单使用与中途退出保持运行

创建一个新的screen: screen -S test 查看刚才创建的screen: screen -ls中途退出screen: 用ctrl+a+d退出screen,然后再×掉cmd窗口了重新打开screen: screen -r 15659.test使用删除命令: screen -X -S 16283.you quit 另附要进入 Docker 容器的 shell的命令:

LA 5031 Graph and Queries【名次树】【离线算法】

题目大义 有一张n结点m条边的无向图,每个结点都有一个权值,你的任务是执行一系列操作,共3种。 1、D X 删除ID为x的边 2、Q X k 计算与x相连的边的第k大权值,如果不存在输出0 3、C X V 把X的权值改为V 题目链接什么的还是给一个 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&It

LeetCode 每日一题 数学篇 2965.找出缺失和重复的数字

给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从 0 开始、长度为 2 的整数数组 ans ,其中 ans[0] 等于 a ,ans[1] 等于 b 。 /*** Note: The returned ar

【数据结构与算法 | 力扣篇】力扣每日一题2965, 2928

1. 力扣2965 : 找出缺失和重复的数字 (1). 题 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从 0 开始、长度为 2 的整数数组 ans ,其中 ans[0] 等于 a ,ans[1] 等于

每日刷题——相遇、宝石(模拟+数学)、相助(模拟+数组)、相依(dp的优化)

相遇 原题链接登录—专业IT笔试面试备考平台_牛客网 题目描述 运行代码 #include<iostream>using namespace std;int main(){int a,b;cin>>a>>b;if(a==b){ cout<<"p";} else if(a - b == 1 || (a == 1 && b == 3)){cout << "b";}else