Advertisement
Guest User

Untitled

a guest
Feb 7th, 2016
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.14 KB | None | 0 0
  1. import java.util.ArrayList;
  2.  
  3. /**
  4.  * Created by gulash on 06.02.16.
  5.  */
  6. public class XorLists {
  7.  
  8.     public int countLists(int[] s, int m) {
  9.         int n = (int)Math.round(Math.sqrt(s.length));
  10.         int[][] a = new int[n][n];
  11.         for(int i = 0; i < n; i++) {
  12.             for(int j = 0; j < n; j++) {
  13.                 a[i][j] = s[i * n + j];
  14.             }
  15.         }
  16.         int max = 1 << 15;
  17.         int mask = max - 1;
  18.         int[][] cnt = new int[n][max];
  19.         for(int i = 0; i < max; i++) {
  20.             ArrayList<Integer> vals = new ArrayList<>();
  21.             vals.add(i);
  22.             for(int j = 1; j < n; j++) {
  23.                 vals.add((a[0][j] & mask) ^ i);
  24.             }
  25.             boolean bad = false;
  26.             for(int v : vals) {
  27.                 if(v > m) {
  28.                     bad = true;
  29.                 }
  30.             }
  31.             if(bad) {
  32.                 continue;
  33.             }
  34.             int xor;
  35.             for(int j = 0; j < n; j++) {
  36.                 for(int z = 0; z < n; z++) {
  37.                     xor = vals.get(j) ^ vals.get(z);
  38.                     if(xor != (a[j][z] & mask)) {
  39.                         bad = true;
  40.                     }
  41.                 }
  42.             }
  43.             if(bad) {
  44.                 continue;
  45.             }
  46.             for(int j = 0; j < n; j++) {
  47.                 cnt[j][vals.get(j)]++;
  48.             }
  49.         }
  50.         int[][] pref = new int[n][max];
  51.         for(int i = 0; i < n; i++) {
  52.             pref[i][0] = cnt[i][0];
  53.         }
  54.         for(int i = 0; i < n; i++) {
  55.             for(int j = 1; j < max; j++) {
  56.                 pref[i][j] = pref[i][j - 1] + cnt[i][j];
  57.             }
  58.         }
  59.         int shift;
  60.         long ans = 0;
  61.         long mod = 1_000_000_007;
  62.         for(int i = 0; i < max; i++) {
  63.             shift = i << 15;
  64.  
  65.             ArrayList<Integer> vals = new ArrayList<>();
  66.             vals.add(shift);
  67.             int val;
  68.             for(int j = 1; j < n; j++) {
  69.                 val = a[0][j];
  70.                 val &= (mask << 15);
  71.                 vals.add(val ^ shift);
  72.             }
  73.             boolean bad = false;
  74.             for(int v : vals) {
  75.                 if(v > m) {
  76.                     bad = true;
  77.                 }
  78.             }
  79.             if(bad) {
  80.                 continue;
  81.             }
  82.             int xor;
  83.             for(int j = 0; j < n; j++) {
  84.                 for(int z = 0; z < n; z++) {
  85.                     xor = vals.get(j) ^ vals.get(z);
  86.                     val = a[j][z];
  87.                     val &= (mask << 15);
  88.                     if(xor != val) {
  89.                         bad = true;
  90.                     }
  91.                 }
  92.             }
  93.             if(bad) {
  94.                 continue;
  95.             }
  96.             int maximum = 0;
  97.             int ind = 0;
  98.             for(int j = 0; j < n; j++) {
  99.                 if(maximum < vals.get(j)) {
  100.                     maximum = vals.get(j);
  101.                     ind = j;
  102.                 }
  103.             }
  104.             int border = Math.min(mask, m - maximum);
  105.             ans = (ans + pref[ind][border]) % mod;
  106.         }
  107.         return (int)ans;
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement