#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e6 + 10;
class Solution {
public:
int trieTree[MAXN][12];
int pass[MAXN];
int cnt;
void build() {
cnt = 1;
}
int getPath(char c) {
if (c == '-')return 10;
else if (c == '#')return 11;
else {
return c - '0';
}
}
void insert(const string& word) {
int cur = 1;
pass[cur]++;
for (char c : word) {
int path = getPath(c);
if (trieTree[cur][path] == 0) {
trieTree[cur][path] = ++cnt;
}
cur = trieTree[cur][path];
pass[cur]++;
}
}
int prefixNumber(const string& prefix) {
int cur = 1;
for (char c : prefix) {
int path = getPath(c);
if (trieTree[cur][path] == 0) {
return 0;
}
cur = trieTree[cur][path];
}
return pass[cur];
}
void clear() {
for (int i = 1; i <= cnt; i++) {
for (int j = 0; j < 12; j++) {
trieTree[i][j] = 0;
}
pass[i] = 0;
}
}
vector<int> countConsistentKeys(vector<vector<int> >& b,
vector<vector<int> >& a) {
build();
vector<int>ans;
for (int i = 0; i < a.size(); i++) {
string str;
for (int j = 1; j < a[i].size(); j++) {
str += to_string(a[i][j] - a[i][j - 1]) + "#";
}
insert(str);
}
for (int i = 0; i < b.size(); i++) {
string str;
for (int j = 1; j < b[i].size(); j++) {
str += to_string(b[i][j] - b[i][j - 1]) + "#";
}
ans.push_back(prefixNumber(str));
}
clear();
return ans;
}
};