sgu275 线性基模板题
2017-11-27 19:24
134 查看
高斯消元求线性基,O(nlogw),两种写法。第二种代码短,但是不能保证性质。
或者这样写
#include <bits/stdc++.h> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 55 inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int n; ll a ,p[62],ans=0; inline void getbasic(){ for(int i=1;i<=n;++i) for(int j=60;j>=0;--j){ if(!(a[i]>>j)) continue;//对线性基的这一位没贡献 if(!p[j]){ p[j]=a[i]; for(int k=j-1;k>=0;--k) if(p[j]>>k&1) p[j]^=p[k]; for(int k=j+1;k<=60;++k) if(p[k]>>j&1) p[k]^=p[j]; break; }//选入线性基中 a[i]^=p[j]; } } int main(){ // freopen("a.in","r",stdin); n=read();for(int i=1;i<=n;++i) a[i]=read(); getbasic(); for(int i=0;i<=60;++i) ans^=p[i];//贪心的全取。这样是对角矩阵。 printf("%lld\n",ans); return 0; }
或者这样写
#include <bits/stdc++.h> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 55 inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int n; ll a ,p[62],ans=0; inline void getbasic(){ for(int i=1;i<=n;++i) for(int j=60;j>=0;--j){ if(!(a[i]>>j)) continue;//对线性基的这一位没贡献 if(!p[j]){p[j]=a[i];break;}//选入线性基中 a[i]^=p[j]; } } int main(){ // freopen("a.in","r",stdin); n=read();for(int i=1;i<=n;++i) a[i]=read(); getbasic(); for(int i=60;i>=0;--i) if((ans^p[i])>ans) ans^=p[i];//这样做只是上三角矩阵,贪心时需要判断一下 printf("%lld\n",ans); return 0; }
相关文章推荐
- [模板]线性基
- [模板] 线性基
- 高斯消元&线性基模板
- [洛谷3812]【模板】线性基
- 模板【洛谷P3812】 【模板】线性基
- 洛谷3812:【模板】线性基——题解
- 线性基 模板 bzoj2460 【BeiJing2011】 元素
- C++模板实现模块间参数传递及回调之二
- Qt元对象系统和模板机制的冲突
- 更改PPT的模板名称
- 类与对象:类模板
- 线段树 原理及模板
- 几个很有用的magento模板调试技巧
- 一个精妙单例CSingleton的赏析------逐渐抽象为单例CSingleton模板
- jeecg - online自定义模板的使用
- 用hibernate实现动态查询+分页的模板,另附struts2的标签在分页中的使用
- SQL建立自己的跟踪模板
- ASP.Net中模板解决方案
- 线段树模板(刘汝佳版本)
- 【PHP自学笔记】第十五章 Smarty模板