【悬 1 关】二维哈希板子样例不过求 debug
查看原帖
【悬 1 关】二维哈希板子样例不过求 debug
1296826
lcfollower楼主2025/7/28 11:14
# include <bits/stdc++.h>

# define int long long
# define up(i ,x ,y) for (int i = x ; i <= y; i ++)
# define dn(i ,x ,y) for (int i = x ; i >= y ;i --)
# define inf 1e18

using namespace std;

inline int read(){int s = 0 , w = 0;char c = getchar();while(!isdigit(c)){w |= (c == '-');c = getchar();}while(isdigit(c)){s = (s << 1) + (s << 3) + (c ^ 48);c = getchar();}return w ? -s : s;}
inline void write(int x){if(x < 0) putchar('-') , x = -x;if(x > 9) write(x / 10);putchar(x % 10 | 48);}
inline void writesp(int x){write(x) , putchar(' ');}
inline void writeln(int x){write(x) , putchar('\n');}

const int N = 1005 ,base = 233 ,mod = 998244353 ,base1 = 131 ,mod1 = 1e9 + 7;
int n ,m ,A ,B;
int pw[N] ,pw1[N] ,b[N] ,ma[N][N] ,ha[N] ,has[N][N];
char a[N][N];
map <int ,bool> vis;
signed main(){
  n = read () ,m = read () ,A = read () ,B = read ();
  pw[0] = pw1[0] = 1;
  up (i ,1 ,1000) pw[i] = pw[i - 1] * base % mod;
  up (i ,1 ,n) {
    up (j ,1 ,m) cin >> a[i][j];
    up (j ,1 ,m) ha[i] = (ha[i] * base + a[i][j]) % mod;
    up (j ,1 ,m) {
      int k = j + B - 1;
      has[i][j] = (ha[k] - ha[j - 1] * pw[B] % mod + mod) % mod;
    }
  } //记第 i 行 [j...k = j + B - 1] 列的哈希值为 has[i][j]
  //每次预处理第 j 到 k 列,看作一组,调取 \forall has[i][j] 记为 a,然后第二次哈希。
  up (j ,1 ,m - B + 1) {
    int k = j + B - 1;
    up (i ,1 ,n) b[i] = has[i][j];
    ha[0] = 1;
    up (i ,1 ,n) ha[i] = (ha[i - 1] * base1 % mod1 + b[i]) % mod1;
    up (i ,1 ,n - A + 1) {
      int dn = i + A - 1;
      int HASH = (ha[dn] - ha[i - 1] * base1 % mod1 + mod1) % mod1;
      vis[HASH] = 1;
    }
  }
  int Q = read ();
  while (Q --) {
    int HASHMA = 0;
    up (i ,1 ,A) {
      int hashma = 0;
      up (j ,1 ,B) {
        char x;
	    cin >> x;
        hashma = (hashma * base % mod + x) % mod;
      } HASHMA = (HASHMA * base1 % mod1 + hashma) % mod1;
    } puts (vis[HASHMA] ? "1" : "0");
  }
  return 0;
}
2025/7/28 11:14
加载中...