Author: loop3r
Date: 20260322
tag: 双指针
link: https://www.luogu.com.cn/problem/P1381问题描述
灵梦有
文章由
输入格式
第
接着是一个数
输出格式
输出文件共
分析
设
- 如果新进来的单词
出现在 中,则 。 - 如果
等于 ,则 ,并且更新 。 - 不停更新
指针的位置,尝试缩短区间长度: cppwhile (i <= j) { // i 保持不动 if (cnt[s[i]] == 1) break; // s[i] 曾出现过,去重,缩短区间长度 if (cnt[s[i]] >= 2) { cnt[s[i]]--; i++; } // 去除非目标单词 if (!w[s[i]]) i++; } - 更新答案:
len = min(len, j - i + 1)。
参考代码
cpp
#include <bits/stdc++.h>
using namespace std;
int n, m, sum, len;
string s[100010];
map<string, int> w, cnt;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
string s; cin >> s;
w[s] = 1;
}
cin >> m;
for (int i = 1, j = 1; j <= m; j++) {
cin >> s[j];
if (w[s[j]]) cnt[s[j]]++;
if (cnt[s[j]] == 1) {
sum++;
len = j - i + 1;
}
while (i <= j) {
// i 保持不动
if (cnt[s[i]] == 1) break;
// s[i] 曾出现过,去重,缩短区间长度
if (cnt[s[i]] >= 2) {
cnt[s[i]]--;
i++;
}
// 去除非目标单词
if (!w[s[i]]) i++;
}
// 更新答案
len = min(len, j - i + 1);
}
cout << sum << endl << len << endl;
return 0;
}