Advertisement
Guest User

Untitled

a guest
May 18th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.43 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5. )
  6.  
  7. func main() {
  8.     var n, m, q, index int
  9.  
  10.     fmt.Scan(&n, &m, &q)
  11.  
  12.     var (
  13.         intArray       = make([][]int, n)
  14.         stringArray    = make([][]string, n)
  15.         stringNewArray = make([][]string, n)
  16.         intNewArray    = make([][]int, n)
  17.     )
  18.  
  19.     for i := 0; i < n; i++ {
  20.         intNewArray[i] = make([]int, m)
  21.         stringNewArray[i] = make([]string, m)
  22.         intArray[i] = make([]int, m)
  23.         stringArray[i] = make([]string, m)
  24.     }
  25.  
  26.     for i := 0; i < n; i++ {
  27.         for j := 0; j < m; j++ {
  28.             fmt.Scan(&intArray[i][j])
  29.         }
  30.     }
  31.  
  32.     for i := 0; i < n; i++ {
  33.         for j := 0; j < m; j++ {
  34.             fmt.Scan(&stringArray[i][j])
  35.         }
  36.     }
  37.  
  38. }
  39.  
  40. func DFS(check [] int, array [][] int, begin int, index *int, m int) {
  41.     check[begin] = *index
  42.     *index++
  43.     for i := 0; i < m; i++ {
  44.         if (check[array[begin][i]] == -1) {
  45.             DFS(check, array, array[begin][i], index, m);
  46.         }
  47.     }
  48. }
  49.  
  50. func Canon(stringarrayold [][] string, intarrrayold [][] int, stringarraynew [][] string, intarrraynew [][] int, array [][] int, m int, n int, q int) {
  51.     var check = make([]int, n)
  52.     for i := 0; i < n; i++ {
  53.         check[i] = -1
  54.     }
  55.     var index = 0
  56.     DFS(check, array, q, &index, m)
  57.     for i := 0; i < n; i++ {
  58.         if (check[i] != -1) {
  59.             stringarraynew[check[i]] = stringarrayold[i]
  60.             for j := 0; j < m; j++ {
  61.                 intarrraynew[check[i]][j] = check[intarrrayold[i][j]]
  62.             }
  63.         }
  64.         q = 0
  65.         n = index
  66.         intarrrayold = intarrraynew
  67.         stringarrayold = stringarraynew
  68.     }
  69. }
  70.  
  71. func find(array [] int, z int) (x int) {
  72.     if (array[z] == z) {
  73.         x = z
  74.         return
  75.     } else {
  76.         array[z] = find(array, array[z])
  77.         x = array[z]
  78.         return
  79.     }
  80. }
  81.  
  82. func Union(array [] int, x int, y int) {
  83.     var (
  84.         x_new = find(array, x)
  85.         y_new = find(array, y)
  86.     )
  87.     if x_new == y_new {
  88.         return
  89.     }
  90.     array[x_new] = y_new;
  91. }
  92.  
  93. func Split(array [] int, m int, n int, intarray [][] int) {
  94.     m = n;
  95.     var superarray = make([]int, n)
  96.     for i := 0; i < m; i++ {
  97.         superarray[i] = i
  98.     }
  99.     for i := 0; i < n; i++ {
  100.         for j := i + 1; j < n; j++ {
  101.             if array[i] == array[j] && find(superarray, i) != find(superarray, j) {
  102.                 var eq bool = true
  103.                 for k := 0; k < m; k++ {
  104.                     if (array[intarray[i][k]] != array[intarray[j][k]]) {
  105.                         eq = false
  106.                         break
  107.                     }
  108.                 }
  109.                 if (eq) {
  110.                     Union(superarray, i, j)
  111.                     m--
  112.                 }
  113.             }
  114.         }
  115.     }
  116.     for i := 0; i < n; i++ {
  117.         array[i] = find(superarray, i)
  118.         }
  119.     }
  120.  
  121.  
  122. func Split1(n int, m int, stringarray[][] string, array [] int) {
  123.     var (
  124.         q int
  125.         eq bool
  126.     )
  127.     q = n
  128.     var superarray = make([]int, n)
  129.     for i := 0; i < m; i++ {
  130.         superarray[i] = i
  131.     }
  132.     for i := 0; i < n; i++ {
  133.         for j := i + 1; j < n; j++ {
  134.             if find(superarray, i) != find(superarray, j) {
  135.                 eq = true
  136.                 for k := 0; k < m; k++ {
  137.                     if (stringarray[i][k] != stringarray[j][k]) {
  138.                         eq = false
  139.                         break
  140.                     }
  141.                 }
  142.                 if (eq) {
  143.                     Union(superarray, i, j);
  144.                     q--
  145.                 }
  146.             }
  147.         }
  148.     }
  149.     for i := 0; i < n; i++ {
  150.         array[i] = find(superarray, i)
  151.     }
  152. }
  153.  
  154.  
  155. func AufenkampHohn() {
  156.     vector<int> help(n);
  157. int m1, m2 = -1;
  158. Split1(m1, help);
  159. while(m1 != m2) {
  160. m2 = m1;
  161. Split(m1, help);
  162. }
  163. vector<int> help1(n), help2(n);
  164. for(int i = 0, a = 0; i < n; i++)
  165. if (help[i] == i) {
  166. help2[a] = i;
  167. help1[i] = a++;
  168. }
  169. this->n = m1;
  170. this->q = help1[help[this->q]];
  171. vector<vector<string>> p(this->n, vector<string>(this->m));
  172. for(int i = 0; i < n; i++)
  173. for(int j = 0; j < m; j++) {
  174. one[i][j] = help1[help[one[help2[i]][j]]];
  175. p[i][j] = two[help2[i]][j];
  176. }
  177. two = p;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement