英语作文

原题链接

题目描述

在写英语作文的时候,两个相同单词靠的太近肯定不好。现在 ZHR 给了你一段n个单词的英文,问你有多少对相同单词中间间隔的单词数小于等于k 。

输入描述:
第一行两个整数,为n 和 k 。

第二行nnn个由仅小写字母组成的单词。每个单词长度小于等于10 。

1<=k<=n<=10^{5}.

输出描述:

一行一个正整数,表示有多少对单词中间间隔的单词数小于等于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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值