原题链接
题目描述
在写英语作文的时候,两个相同单词靠的太近肯定不好。现在 ZHR 给了你一段n个单词的英文,问你有多少对相同单词中间间隔的单词数小于等于k 。
输入描述:
第一行两个整数,为n 和 k 。
第二行nnn个由仅小写字母组成的单词。每个单词长度小于等于10 。
1
输出描述:
一行一个正整数,表示有多少对单词中间间隔的单词数小于等于k。
示例1
输入
11 2
i love you you love mi mixue ice cream and tea
输出
2
说明
只有 you 和 love 两个单词间隔的单词数小于等于2
首先最简单的思路就是两个for循环,但是肯定会超时。
看到string和数字,可以用map起来。接下来遍历字联系符串数组,每一次让mp[str[i]]++,表示字符串str[i]出现的次数加一(为了对后面的单词做计算),然后对一个区间k+1进行操作,因为第k-i-1个字符串下一个循环就要离开这个区间,所以令mp[str[i-i-1]]--。每一次循环的开始变对mp[str[i]]求和,表示字符串单词间隔小于等于k的个数。
C++AC代码
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
long long ans;
string a[maxn];
map<string,int>mp;
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
ans+=mp[a[i]];
mp[a[i]]++;
if(i>=k+1) mp[a[i-k-1]]--;
}
cout<<ans;
return 0;
}