洛谷P1381 单词背诵(哈希、尺取法、双指针)

题目来源:https://www.luogu.com.cn/problem/P1381

`

define int long long

const int P = 131;
const int MOD = 9988234;
unordered_map<int, int>words;
unordered_map<int, int>uw;
int essay[100010];

int gethash(string s) {
int h = 0;
for (char c : s) {
h = (h * P + c) % MOD;
}
return h;
}

signed main() {
int n; cin >> n;
for (int i = 0; i < n; i++) {
string s; cin >> s;
words[gethash(s)]++;
}
int m; cin >> m; int sp = -1; int ep = -2; int ans = 0; int anslen = 0;
for (int i = 0; i < m; i++) {
string us; cin >> us;
essay[i] = gethash(us);
if (sp == -1 && words[essay[i]] > 0) {
sp = i; ep = i; uw[essay[i]]++; ans++; anslen = 1;
}
else if (sp != -1) {
ep = i;
if (words[essay[i]] > 0) {
uw[essay[i]]++;
if (uw[essay[i]] == 1) { ans++; anslen = ep - sp + 1; }
}
}
while (sp < ep && (uw[essay[sp]] > 1 || words[essay[sp]] == 0)) {
if (uw[essay[sp]] > 1) {
uw[essay[sp]]--;
}
sp++;
}
anslen = min(anslen, ep - sp + 1);
}
cout << ans << endl << anslen << endl;
return 0;
}`
比较清楚明了的题,字符串哈希,难点是有些细节

debug过程:
第一次debug:修改了边界问题,比如没有可背单词的情况,这个时候ep-sp+1会产生多余一个计数
第二次debug:修改了原来的双边界收缩想法(最后cout出ep-sp+1),改成每次增加新char时都记录长度,来不断更新最小len,以免迭代到的最后一个有效子串是较长的串。

posted @ 2025-07-15 12:27  yubai111  阅读(8)  评论(0)    收藏  举报