训练指南-1.3-高效算法-LA2965侏罗纪-中途相遇法,子集枚举,映射⭐⭐⭐⭐⭐难度:3
2018-03-12 20:58
363 查看
#include<cstdio> #include<iostream> #include<map> using namespace std; const int maxn=30; int n,A[maxn]; char s[1000]; int bitcount(int x){ return x==0?0:bitcount(x/2)+(x&1);//x&1加括号 } int main(){ while(cin>>n){ for(int i=0;i<n;i++){ cin>>s; A[i]=0; for(int j=0;s[j]!='\0';j++){ A[i]^=1<<(s[j]-'A'); } } int n1=n/2; int n2=n-n1; map<int,int> table; table.clear();//注意初始化 for(int i=0;i<(1<<n1);i++){ int x=0; for(int j=0;j<n1;j++){ if((1<<j)&i) x^=A[j]; } if(!table.count(x)||bitcount(table[x])<bitcount(i)) //table.countq前面不要丢掉! 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((1<<j)&i) x^=A[n1+j]; //n1+j不是n1+j-1 } if(table.count(x)&&bitcount(ans)<bitcount(i)+bitcount(table[x])) ans=(i<<n1)^table[x];//合并操作 需先将第二部分的结果左移n1位再和第一部分结果做^运算 是^运算不是& } cout<<bitcount(ans)<<endl; for(int i=0;i<n;i++){ if((1<<i)&ans) cout<<i+1<<" "; } cout<<endl; } //system("pause"); return 0; }
相关文章推荐
- UVa 1326 - Jurassic Remains(枚举子集+中途相遇法)
- 高效算法——J 中途相遇法,求和
- 【高效算法设计-中途相遇法】4 Values whose Sum is 0 哈希表
- 集训第四周(高效算法设计)J题 (中途相遇法)
- 《算法竞赛-训练指南》第一章-1.24_pre-一维数组最大连续和
- HDU-4963 Dividing a String (枚举[中途相遇法])
- 关于算法竞赛入门经典一书的思考学习——枚举排序和子集生成!
- Uva 11235 频繁出现的数值(RMQ-Sparse Table 算法)(训练指南)
- 《算法竞赛-训练指南》-第一章-1.10_UVa 11384
- NOIP模拟赛1 飞盘队(貌似又是USACO上面的题) MR_HE改编 子集生成+中途相遇+dp
- 《算法竞赛-训练指南》第一章-1.27-UVa 10635
- 《算法竞赛-训练指南》第二章-HDU_2018
- LA4119--算法入门经典训练指南
- 一天一道算法题---6.4--中途相遇法
- 《算法竞赛-训练指南》第一章-1.24-UVa 10755
- 枚举所有子集的三种算法详解-《算法入门经典》
- 高效的六面体变换算法实现(一) —— 等圆柱映射 与 六面体映射(MarkDown编辑器版)
- 《算法竞赛-训练指南》第一章-1.22_LA 3209
- 《算法竞赛-训练指南》第三章-RMQ
- 蓝桥杯 算法训练 字串统计 (字符串、枚举)