牛客练习赛88-B-寻寻觅觅寻不到
循环哈希匹配,匹配成功就退出。
比赛时一直wa,原因在于,代码第33行,循环的终止条件应该是 i <= lens - k + 1,而不是 i <= lens。
思路是,枚举每一个空位,将长度为k的子串插到当前的空,判断得到的新串的哈希值是否等于母串的哈希值。
wa的原因就是,末尾的子串前是不存在空位的了,不能拿去枚举。
#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N = 3e5 + 5, mod = 998244353;
unsigned long long h1[N], h2[N], P[N];
signed main()
{
int n;
cin >> n;
P[0] = 1;
for (int i = 1; i <= N - 1; i++) P[i] = P[i - 1] * 131;
while(n--) {
string s, t;
int k;
cin >> s >> t >> k;
int lens = s.length(), lent = t.length();
if (lens != lent || k > lens) {
printf("NO\n");
continue;
}
s = " " + s;
t = " " + t;
for (int i = 1; i <= lens; i++) {
h1[i] = h1[i - 1] * 131 + s[i];
h2[i] = h2[i - 1] * 131 + t[i];
}
if (h1[lens] == h2[lens]) {
printf("YES\n");
continue;
}
int hk = h2[lens] - h2[lens - k] * P[k];
bool ck = 0;
for (int i = 1; i <= lens - k + 1; i++) {
int l = h2[i - 1];
int mid = h2[lens - k] - h2[i - 1] * P[lens - k - i + 1];
int pp = l * P[lens - (i - 1)] + hk * P[lens - k - (i - 1)] + mid;
if (pp == h1[lens]) {
ck = 1;
break;
}
}
if (ck) printf("YES\n");
else printf("NO\n");
for (int i = 1; i <= lens; i++) h1[i] = h2[i] = 0;
}
return 0;
}
PS:几个特判删掉好像也不会WA