总结20220210

上午写了几个题,下午把题组又看了一遍,然后对着代码模拟演算了一下next数组,晚上看了一些图论的知识,没怎么看懂。

A-B 数对

题目描述

出题是一件痛苦的事情!

相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

好吧,题目是这样的:给出一串数以及一个数字 CC,要求计算出所有 A - B = CA−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个整数 N, CN,C。

第二行,NN 个整数,作为要求处理的那串数。

输出格式

一行,表示该串数中包含的满足 A - B = CA−B=C 的数对的个数。

输入输出样例

输入 #1复制

4 1
1 1 2 3

输出 #1复制

3
#include<bits/stdc++.h>
using namespace std;
int main(){
	int x,y;
	cin>>x>>y;
	long long int a[x+1],sum=0;
	for(int i=0;i<x;i++)
		cin>>a[i];	
	sort(a,a+x);
	for(int i=0;i<x;i++)
		sum+=((upper_bound(a,a+x,a[i]+y)-a)-(lower_bound(a,a+x,a[i]+y)-a));//符合要求的数的数量
	cout<<sum;
	return 0;
}

字符串哈希

题目描述

如题,给定 NN 个字符串(第 ii 个字符串长度为 M_iMi​,字符串内包含数字、大小写字母,大小写敏感),请求出 NN 个字符串中共有多少个不同的字符串。

友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:)

输入格式

第一行包含一个整数 NN,为字符串的个数。

接下来 NN 行每行包含一个字符串,为所提供的字符串。

输出格式

输出包含一行,包含一个整数,为不同的字符串个数。

输入输出样例

输入 #1复制

5
abc
aaaa
abc
abcc
12345

输出 #1复制

4
#include<bits/stdc++.h>
using namespace std;
list<string>q;//链表
int main()
{
	int n;
	cin >> n;
	for (int i=1; i<=n; i++)
	{
		string s;
		cin >> s;//输入
		q.push_front(s);//加入链表
	}
	q.sort();//排序
	q.unique();//去重
	cout << q.size();//输出
	return 0; 
}

于是他错误的点名开始了

题目背景

XS中学化学竞赛组教练是一个酷爱炉石的人。

他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛 CON900)。

题目描述

这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名。(为什么不直接不让他玩炉石。)

输入格式

第一行一个整数 nn,表示班上人数。

接下来 nn 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 5050)。

第 n+2n+2 行一个整数 mm,表示教练报的名字个数。

接下来 mm 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 5050)。

输出格式

对于每个教练报的名字,输出一行。

如果该名字正确且是第一次出现,输出 OK,如果该名字错误,输出 WRONG,如果该名字正确但不是第一次出现,输出 REPEAT

输入输出样例

输入 #1复制

5  
a
b
c
ad
acd
3
a
a
e

输出 #1复制

OK
REPEAT
WRONG
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<string,int>a;
string s1,s2;
int main(){	
	int n,m;
    cin>>n;
    for(int i=0;i<n;i++) {
    	cin>>s1;		
        a[s1]=1;		
    }
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>s2;
        if(a[s2]==1) {		//在名单中但未被点到 
			cout<<"OK"<<endl;
			a[s2]++;			//已点到 
		}
        else if(a[s2]==2) cout<<"REPEAT"<<endl;	//重复
        else cout<<"WRONG"<<endl;		//没有 
    }
    return 0;
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值