链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
在写英语作文的时候,两个相同单词靠的太近肯定不好。现在 ZHR 给了你一段nnn个单词的英文,问你有多少对相同单词中间间隔的单词数小于等于kkk 。
输入描述:
第一行两个整数,为nnn 和 kkk 。
第二行nnn个由仅小写字母组成的单词。每个单词长度小于等于101010 。
1≤k≤n≤1051\le k \le n \le 10^51≤k≤n≤105。
输出描述:
一行一个正整数,表示有多少对单词中间间隔的单词数小于等于kkk 。
示例1
输入
复制11 2 i love you you love mi mixue ice cream and tea
11 2 i love you you love mi mixue ice cream and tea
输出
复制2
2
说明
只有 you 和 love 两个单词间隔的单词数小于等于222
示例2
输入
复制10 2 a a a a a a a a a a
10 2 a a a a a a a a a a
输出
复制24
24
思路:用map<string,vector<int> >,一个存他的单词,一个存他的下标,把他的下标存进vector里。在加入一个数的下标i前先判断他的vector数组里有没有数,如果有,说明前面有与他相同的单词,就找到他最左能到的下标i-k+1这个数在vector数组中的下标,然后用他最右边的数的下标减去他最左能到的下标,就是能与他配对的个数。
注意:最后结果用longlong存,如果用int只能通过百分之九十的实例。
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
int main(){
int n,k;
long long con=0;
scanf("%d%d",&n,&k);
map<string,vector<int> > a;
for(int i=1;i<=n;i++){
string s;
cin>>s;
if(a[s].size()!=0){
int q=lower_bound(a[s].begin(),a[s].end(),i-k-1)-a[s].begin();
con+=a[s].size()-q;
}
a[s].push_back(i);
}
printf("%lld",con);
return 0;
}