代码把 所有小数组拼 (tmp)次,然后再这个拼成的数组维护一个长度为 t的数组的哈希值,遇到小数组结尾就更新答案...
好像是不对的,但样例过了,如果是循环节的问题,那么循环节到底为多少啊qwq.
```cpp
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define SZ(T) ((int)T.size())
using namespace std;
// head
const int N = 400010;
const int mod1 = 998244353, mod2 = 1000000007;
const int base1 = 5000011, base2 = 2124247;
int pw1[N], pw2[N];
pair<int, int> hs1, hs2;
int n, t, q, m, p;
int s[N], r[N];
vector<int> a[N];
int ss[N], tt, pos[N];
int f[N], vis[N];
void modify(int x) {
// 将 ss[x] 加入hs
hs2.fi = (hs2.fi + pw1[ss[x]] % mod1 + mod1) % mod1;
hs2.se = (hs2.se + pw2[ss[x]] % mod2 + mod2) % mod2;
// 如果 x - t > 0, 则踢掉 ss[x - t]
if (x - t > 0) {
hs2.fi = (hs2.fi - pw1[ss[x - t]] % mod1 + mod1) % mod1;
hs2.se = (hs2.se - pw2[ss[x - t]] % mod2 + mod2) % mod2;
}
}
void solve(int CaseT) {
cin >> n >> t >> q;
for (int i = 1; i <= t; i++)
cin >> s[i];
for (int i = 1; i <= n; i++) {
int l;
cin >> l;
for (int j = 1; j <= l; j++) {
int x;
cin >> x;
a[i].push_back(x);
}
}
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> r[i];
for (int j = 0; j < SZ(a[r[i]]); j++)
ss[++tt] = a[r[i]][j];
pos[tt] = 1;
}
// tt < 100000
int tot = 2 * max(t, tt); // <= 200010
int ppp = tt;
int tmp = tot / tt + (tot % tt != 0);
for (int j = 1; j <= tmp; j++) {
for (int i = 1; i <= tt; i++)
ss[i + tt * j] = ss[i], pos[i + tt * j] = pos[i];
}
tt *= tmp; // <= 300000
pw1[0] = 1;
pw2[0] = 1;
for (int i = 1; i <= tt; i++) {
pw1[i] = (pw1[i - 1] * base1 % mod1 + mod1) % mod1;
pw2[i] = (pw2[i - 1] * base2 % mod2 + mod2) % mod2;
}
for (int i = 1; i <= t; i++) {
hs1.fi = (hs1.fi + pw1[s[i]] % mod1 + mod1) % mod1;
hs1.se = (hs1.se + pw2[s[i]] % mod2 + mod2) % mod2;
}
int ans = 0;
int p = 0;
int zero = 0, one = 0;
for (int i = 1; i <= tt; i++) {
modify(i);
if (pos[i] && i - t + 1 > 0) {
ans += (hs1 == hs2);
}
p += (pos[i]);
f[p] = ans;
if (p % m == 1 || m == 1) {
if (!vis[p] && p) {
zero += (f[p] - f[p-1] == 0);
one += (f[p] - f[p-1] != 0);
vis[p] = 1;
}
}
}
cout << ((f[p] + zero * (one != 0)) * (q / p) + f[q % p]) << '\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int _;
_=1;
// cin>>_;
for (int i = 1; i <= _; i++)
solve(i);
return 0;
}