求助,调了4、5个小时,好像是循环节的问题
查看原帖
求助,调了4、5个小时,好像是循环节的问题
434482
Rufu楼主2023/4/30 22:39

代码把 所有小数组拼 (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;
}
2023/4/30 22:39
加载中...