2015.9.1组队赛第2场1003

来源:互联网 发布:js插件如何编写 编辑:程序博客网 时间:2024/05/22 16:50
<h3 style="font-family: 'Times New Roman', Times, serif; font-size: 17px; margin: 8px auto; color: rgb(26, 92, 200); cursor: pointer;">Problem Description</h3><div id="procon" style="width: 960px; margin: 0px 0px 0px 20px; line-height: 1.4em; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">有一串不超过50000长的10^9以内的正整数数列。找出满足xor值为0的连续子序列中有最大and值的连续子序列的and值。若不存在这样的连续子序列输出0.</div><h3 style="font-family: 'Times New Roman', Times, serif; font-size: 17px; margin: 8px auto; color: rgb(26, 92, 200); cursor: pointer;">Input</h3><div id="proinput" style="width: 960px; margin: 0px 0px 0px 20px; line-height: 1.4em; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">第一行是样例个数。每一个样例第一行是n,表示有n个数。第二行有n个数,表示数列的n个数。</div><h3 style="font-family: 'Times New Roman', Times, serif; font-size: 17px; margin: 8px auto; color: rgb(26, 92, 200); cursor: pointer;">Output</h3><div id="prooutput" style="width: 960px; margin: 0px 0px 0px 20px; line-height: 1.4em; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">每一个样例,输出最大的and值。</div><h3 style="font-family: 'Times New Roman', Times, serif; font-size: 17px; margin: 8px auto; color: rgb(26, 92, 200); cursor: pointer;">Sample Input</h3><div id="prosamplein" style="width: 960px; margin: 0px 0px 0px 20px; line-height: 1.4em; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;"><pre style="background-color: rgb(245, 245, 245);">241 2 4 831 2 3

Sample Output

0

#pragma comment(linker, "/STACK:1024000000,1024000000")#pragma warning(disable:4996)#include<cstdio>#include<iostream>#include<map>#include<algorithm>using namespace std;#define LL long long#define INF 0x3f3f3f3f#define mod 1000000007#define rep(i,n) for(int i=0;i<n;++i)#define Rep(i,n) for(int i=1;i<=n;++i)int a[50050] = { 0 };int d[50050][20];
//用st算法记录区间[L,R]之间的与值void init(int n) {rep(i, n + 1) d[i][0] = a[i];for (int j = 1; (1 << j) <= n; ++j) {for (int i = 0; i + (1 << j) - 1 <= n; ++i) {d[i][j] = d[i][j - 1] & d[i + (1 << j - 1)][j - 1];}}}int query(int l, int r) {int k = 0;while ((1 << k + 1) <= r - l + 1) ++k;return d[l][k] & d[r - (1 << k) + 1][k];}int main(){int t, n, x;cin >> t;while (t--) {scanf("%d", &n);map<int, int>mp;mp[0] = 0;int sum = 0, ans = 0;Rep(i, n) {scanf("%d", a + i);}init(n);Rep(i, n) {sum ^= a[i];if (mp.count(sum)) {//在mp[sum]的时候异或为sum,在i的时候异或为sum,所以mp[sum]+1到i之间的元素抑或为0ans = max(ans, query(mp[sum] + 1, i));}mp[sum] = i;}printf("%d\n", ans);}return 0;}

0 0