Nowcoder 英语作文
摘要
Title: Nowcoder 英语作文
Tag: 双指针、二分
Memory Limit: 64 MB
Time Limit: 1000 ms
Powered by:NEFU AB-IN
Nowcoder 英语作文
-
题意
在写英语作文的时候,两个相同单词靠的太近肯定不好。现在 ZHR 给了你一段n个单词的英文,问你有多少对相同单词中间间隔的单词数小于等于k 。
-
思路
题目相当于问,有多少对间隔小于等于k的单词
二分:每个单词维护一个vector,记录单词的下标,每次进行二分即可
双指针:每次统计此单词前面满足条件的单词有多少个,当说明超过了,对应的开头即可 -
代码
二分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using namespace std;
const int N = 1e5 + 10;
unordered_map<string, vector<int>> v;
int main()
{
int n, k;
cin >> n >> k;
string s;
long long cnt = 0, ans = 0;
while (cin >> s)
{
ans += v[s].size() - (lower_bound(v[s].begin(), v[s].end(), cnt - k) - v[s].begin());
v[s].push_back(++cnt);
}
cout << ans << '\n';
}
双指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25/*
* @Author: NEFU AB-IN
* @Date: 2021-10-25 10:13:38
* @FilePath: \ACM\test.cpp
* @LastEditTime: 2022-03-28 21:09:43
*/
using namespace std;
string a[100005];
int main()
{
int n, k;
long long sum = 0;
cin >> n >> k;
map<string, int> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
sum = sum + m[a[i]];
m[a[i]]++;
if (i > k + 1)
m[a[i - k - 1]]--;
}
cout << sum << '\n';
}