Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef vector<int> vi;
- typedef vector<ll> vl;
- typedef pair<int,int> pii;
- typedef pair<ll,ll> pll;
- #define pi 3.141592653589793
- #define mod 1000000007
- #define pb push_back
- #define all(v) v.begin(),v.end()
- #define tc int t;cin>>t;while(t--)
- #define pqmax priority_queue<int>
- #define pqmin priority_queue<int,vi,greater<int>>
- #define fast_io ios_base::sync_with_stdio(0), cin.tie(NULL)
- #define tc_g int tt;cin>>tt;for(int ti=1;ti<=tt;ti++)
- #define case_g "Case #"<<ti<<": "
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- typedef tree<int, null_type, greater_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_multiset;
- typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
- typedef tree<int, int, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_map;
- int ans = 0;
- vi a, b;
- vi prefix_array(vi& pat) {
- int len = 0;
- int n = pat.size();
- vi lps(n);
- lps[0] = 0;
- int i = 1;
- while (i < n) {
- if (pat[i] == pat[len]) {
- len++;
- lps[i] = len;
- i++;
- }
- else if (len != 0)
- len = lps[len - 1];
- else {
- lps[i] = 0;
- i++;
- }
- }
- return lps;
- }
- void KMPSearch(vi& pat, vi& pass, int x)
- {
- int M = pat.size();
- int N = pass.size();
- vi lps = prefix_array(pat);
- int i = 0, j = 0;
- while (i < N) {
- if (pat[j] == pass[i]) {
- j++;
- i++;
- }
- if (j == M) {
- if (abs(b[i - j] - a[0]) <= x)
- ans++;
- j = lps[j - 1];
- }
- else if (i < N && pat[j] != pass[i]) {
- if (j != 0)
- j = lps[j - 1];
- else
- i = i + 1;
- }
- }
- }
- int main() {
- fast_io;
- tc {
- int x, n, m;
- cin >> x >> n;
- a.resize(n);
- for (int i = 0;i < n;i++)
- cin >> a[i];
- cin >> m;
- b.resize(m);
- for (int i = 0;i < m;i++)
- cin >> b[i];
- vi pat(n - 1);
- for (int i = 0;i < n - 1;i++)
- pat[i] = a[i + 1] - a[i];
- vi pass(m - 1);
- for (int i = 0;i < m - 1;i++)
- pass[i] = b[i + 1] - b[i];
- ans = 0;
- if (n > 1) {
- KMPSearch(pat, pass, x);
- }
- else {
- for (auto p : b)
- if (abs(p - a[0]) <= x)
- ans++;
- }
- cout << ans << '\n';
- }
- }
Add Comment
Please, Sign In to add comment