题解 | #赢的次数#

赢的次数

https://ac.nowcoder.com/acm/contest/11223/A

C题:英语作文 (思想:二分查找)

最开始想用哈希表来着,但是后来写着写着嫌麻烦换了一种写法,但原理类似,都是将string转换成int类型,然后采用vector数组去存储。不同的字符串转换成不同的vector数组下标,转换的工作让map来完成。

在处理相同的单词时,使用二分查找寻找到最后一个满足距离差<=k+1的下标即可,时间复杂度O(nlogn)

#include<map>
#include<vector>
using namespace std;
#define N 100010
string s[N];
map<string,long long> m;
vector<long long> v[N];
int n,k;
int binsearch(int value,int hash,int low,int high){
	int mid=(high+low)/2;
	if(1+low==high){
		if(value-v[hash][low]<=k+1) return low;
		else return high;
	}
	else if(value-v[hash][mid]<=k+1){
		return binsearch(value,hash,low,mid);
	}
	else{
		return binsearch(value,hash,mid,high);
	}
}
int main(){
	cin>>n>>k;
	int num=1;
	for(int i=0;i<n;i++){
		cin>>s[i];
		if(!m[s[i]]){
			m[s[i]]=num++;
		}
	}
	long long cnt=0;
	
	for(int i=0;i<n;i++){
		int hash = m[s[i]];
		if(v[hash].size()){
			if(i-v[hash][v[hash].size()-1]<=k+1){
				int mid=binsearch(i,hash,0,v[hash].size());
				cnt+=v[hash].size()-mid;
			}
		}
		v[hash].push_back(i);
	}
	cout<<cnt<<endl;
}
/*
10 2
a a a a a a a a a a
*/
全部评论
少了cstring和iostream头文件没有引入
点赞 回复 分享
发布于 2023-09-10 16:04 上海

相关推荐

07-10 11:08
门头沟学院 Java
Sairus:我注册都注册不了提醒我手机号二次啥的,果然对于人才推得就是快,像我投完了就没回音的
投递京东等公司9个岗位
点赞 评论 收藏
分享
06-12 16:23
已编辑
小米_软件开发(准入职员工)
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务