Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- /**
- * Created by gulash on 06.02.16.
- */
- public class XorLists {
- public int countLists(int[] s, int m) {
- int n = (int)Math.round(Math.sqrt(s.length));
- int[][] a = new int[n][n];
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < n; j++) {
- a[i][j] = s[i * n + j];
- }
- }
- int max = 1 << 15;
- int mask = max - 1;
- int[][] cnt = new int[n][max];
- for(int i = 0; i < max; i++) {
- ArrayList<Integer> vals = new ArrayList<>();
- vals.add(i);
- for(int j = 1; j < n; j++) {
- vals.add((a[0][j] & mask) ^ i);
- }
- boolean bad = false;
- for(int v : vals) {
- if(v > m) {
- bad = true;
- }
- }
- if(bad) {
- continue;
- }
- int xor;
- for(int j = 0; j < n; j++) {
- for(int z = 0; z < n; z++) {
- xor = vals.get(j) ^ vals.get(z);
- if(xor != (a[j][z] & mask)) {
- bad = true;
- }
- }
- }
- if(bad) {
- continue;
- }
- for(int j = 0; j < n; j++) {
- cnt[j][vals.get(j)]++;
- }
- }
- int[][] pref = new int[n][max];
- for(int i = 0; i < n; i++) {
- pref[i][0] = cnt[i][0];
- }
- for(int i = 0; i < n; i++) {
- for(int j = 1; j < max; j++) {
- pref[i][j] = pref[i][j - 1] + cnt[i][j];
- }
- }
- int shift;
- long ans = 0;
- long mod = 1_000_000_007;
- for(int i = 0; i < max; i++) {
- shift = i << 15;
- ArrayList<Integer> vals = new ArrayList<>();
- vals.add(shift);
- int val;
- for(int j = 1; j < n; j++) {
- val = a[0][j];
- val &= (mask << 15);
- vals.add(val ^ shift);
- }
- boolean bad = false;
- for(int v : vals) {
- if(v > m) {
- bad = true;
- }
- }
- if(bad) {
- continue;
- }
- int xor;
- for(int j = 0; j < n; j++) {
- for(int z = 0; z < n; z++) {
- xor = vals.get(j) ^ vals.get(z);
- val = a[j][z];
- val &= (mask << 15);
- if(xor != val) {
- bad = true;
- }
- }
- }
- if(bad) {
- continue;
- }
- int maximum = 0;
- int ind = 0;
- for(int j = 0; j < n; j++) {
- if(maximum < vals.get(j)) {
- maximum = vals.get(j);
- ind = j;
- }
- }
- int border = Math.min(mask, m - maximum);
- ans = (ans + pref[ind][border]) % mod;
- }
- return (int)ans;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement