Algorithm


D. Mysterious Crime
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Acingel is a small town. There was only one doctor here — Miss Ada. She was very friendly and nobody has ever said something bad about her, so who could've expected that Ada will be found dead in her house? Mr Gawry, world-famous detective, is appointed to find the criminal. He asked m neighbours of Ada about clients who have visited her in that unlucky day. Let's number the clients from 11 to n. Each neighbour's testimony is a permutation of these numbers, which describes the order in which clients have been seen by the asked neighbour.

However, some facts are very suspicious – how it is that, according to some of given permutations, some client has been seen in the morning, while in others he has been seen in the evening? "In the morning some of neighbours must have been sleeping!" — thinks Gawry — "and in the evening there's been too dark to see somebody's face...". Now he wants to delete some prefix and some suffix (both prefix and suffix can be empty) in each permutation, so that they'll be non-empty and equal to each other after that — some of the potential criminals may disappear, but the testimony won't stand in contradiction to each other.

In how many ways he can do it? Two ways are called different if the remaining common part is different.

Input

The first line contains two integers n and m (1n1000001≤�≤1000001m101≤�≤10) — the number of suspects and the number of asked neighbors.

Each of the next m lines contains n integers a1,a2,,an�1,�2,…,�� (1ain1≤��≤�). It is guaranteed that these integers form a correct permutation (that is, each number from 11 to n appears exactly once).

Output

Output a single integer denoting the number of ways to delete some prefix and some suffix of each permutation (possibly empty), such that the remaining parts will be equal and non-empty.

Examples
input
Copy
3 2
1 2 3
2 3 1
output
Copy
4
input
Copy
5 6
1 2 3 4 5
2 3 1 4 5
3 4 5 1 2
3 5 4 2 1
2 3 5 4 1
1 2 3 4 5
output
Copy
5
input
Copy
2 2
1 2
2 1
output
Copy
2
Note

In the first example, all possible common parts are [1][1][2][2][3][3] and [2,3][2,3].

In the second and third examples, you can only leave common parts of length 11.

 

Code Examples

#1 Code Example with C++ Programming

Code - C++ Programming

#include <bits/stdc++.h>

using namespace std;

int const N = 1e5 + 1, M = 1e9 + 9;
int n, m, a[N][10], p, idxs[N][10];
long long hash_value[N][10], p_pow[N], ip_pow[N];

long long fst(long long b, long long p) {
  if(p == 0)
    return 1;
  if(p == 1)
    return b;

  long long ret = fst(b, p >> 1) % M;
  ret = ret * ret % M;

  if(p & 1)
    ret = ret * b % M;

  return ret;
}

void compute_hash(int idx) {
  hash_value[1][idx] = (1ll * a[1][idx] * p_pow[1]) % M;
  for(int i = 2; i <= n; ++i)
    hash_value[i][idx] = (hash_value[i - 1][idx] + (1ll * a[i][idx] * p_pow[i]) % M) % M;
}

bool can(int mid, int v) {
  if(idxs[v][0] + mid - 1 > n)
    return false;
  long long cur = (1ll * (((hash_value[idxs[v][0] + mid - 1][0] - hash_value[idxs[v][0] - 1][0]) + M) % M) * ip_pow[idxs[v][0]]) % M;
  for(int i = 0; i < m; ++i) {
    if(idxs[v][i] + mid - 1 > n)
      return false;
    if((1ll * (((hash_value[idxs[v][i] + mid - 1][i] - hash_value[idxs[v][i] - 1][i]) + M) % M) * ip_pow[idxs[v][i]]) % M != cur)
      return false;
  }
  return true;
}

int calc(int v) {
  int ret = 0, l, r, mid, res;

  l = 1, r = N, mid, res = 0;
  while(l <= r) {
    mid = (l + r) >> 1;
    if(can(mid, v))
      res = mid, l = mid + 1;
    else
      r = mid - 1;
  }
  ret += res;

  return ret;
}

int main() {
  p = 100003;
  p_pow[1] = ip_pow[1] = 1;
  for(int i = 2; i < N; ++i) {
    p_pow[i] = (1ll * p_pow[i - 1] * p) % M;
    ip_pow[i] = fst(p_pow[i], M - 2);
  }

  scanf("%d %d", &n, &m);
  for(int i = 0; i < m; ++i) {
    for(int j = 1; j <= n; ++j) {
      scanf("%d", &a[j][i]);
      idxs[a[j][i]][i] = j;
    }
    compute_hash(i);
  }

  long long res = 0;
  for(int i = 1; i <= n; ++i)
    res += calc(i);

  printf("%lld\n", res);

  return 0;
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
3 2
1 2 3
2 3 1

Output

x
+
cmd
4
Advertisements

Demonstration


Codeforces Solution-D. Mysterious Crime-Solution in C, C++, Java, Python,Mysterious Crime,Codeforces Solution

Previous
Codeforces solution 1080-B-B. Margarite and the best present codeforces solution
Next
CodeChef solution DETSCORE - Determine the Score CodeChef solution C,C+