题目描述
Moon 正在准备计算机网络的开学考,复习到了有关交换机的知识。交换机具有令人惊奇的特性那就是 它的表是自动、动态和自治地建立的,即没有来自网络管理员或来自配置协议的任何干预。换句话说,交换 机是自学习的。这种能力大概是通过如下方式实现的:
1)交换机表初始为空。
2)对于在每个接口接收到的每个数据帧,该交换机在其表中存储数据帧的源 MAC 地址。
3)如果在一段时间 (称为老化期) 后,交换机没有接收到含有某个源 MAC 地址的数据帧,就会在表中删 除这个源 MAC 地址。
现在给出了某天中一个交换机所有收到的数据帧(每一个数据帧包含一个源 MAC 地址,以及该数据帧 的到达时间),请你帮助 Moon 算出在这一天中,这个交换机的表最少需要多少项,才可以使得这天所有数据 帧的信息可以存储下来。注意为了简单起见,每个时间点先进行删除操作再进行插入操作注意为了简单起见,每个时间点先进行删除操作再进行插入操作。
简单来说,需要维护一个字符串集合 S,有若干次插入操作,每次插入操作包含一个字符串以及一个有 效时间区间(区间长度为定值),需要求出所有时间内,字符串集合 S 大小的最大值。
输入格式
第一行两个整数 n,k,分别表示数据帧的个数,以及老化期时间(单位:分钟)。
接下来 n 行,每行两个字符串s1,s2,表示数据帧包含的源地址帧,以及到达时间,其中 s1 是一个 MAC 地址,包含 12 个 16 进制数,s2 的格式为 a:b,其中0≤a≤23,0≤b≤59,表示该数据帧在 a 时 b 分钟 00 秒到达交换机,并且 a,b 不足 10 的数字前面要补充一个零。
输出格式
一行,一个整数,代表答案
输入样例1
4 10
0123456789ABCDEF 00:10
0000000000ABCDEF 08:11
0123456789ABCDEF 00:15
0000000000ABCDEF 00:11
输出样例1
2
输入样例2
3 60
0123456789ABCDEF 13:00
0000000000000000 14:00
0123456789ABCDEF 12:30
输出样例2
1
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=3800;
struct uuu{
string s,s2;
long long st,en;
}a[N];
long long ti[M];
map <string,long long> mp;
long long getnum(string s)
{
long long ans=0;
ans=((s[0]-48)*10+(s[1]-48));
ans*=60;
ans+=((s[3]-48)*10+(s[4]-48));
return ans;
}
bool cmp(uuu b,uuu c)
{
return b.st<c.st;
}
int main()
{
long long n,k;
cin>>n>>k;
string s,s2;
for(long long i=1;i<=n;i++)
{
cin>>a[i].s>>a[i].s2;
a[i].st=getnum(a[i].s2);
a[i].en=a[i].st+k;
}
sort(a+1,a+1+n,cmp);
for(long long i=1;i<=n;i++)
{
if(mp[a[i].s]+k>=a[i].st)
{
ti[mp[a[i].s]+k]++;
ti[a[i].en]--;
}else
{
ti[a[i].st]++;
ti[a[i].en]--;
}
mp[a[i].s]=a[i].st;
}
long long sum=0,maxn=0;
for(long long i=0;i<=1500;i++)
{
sum+=ti[i];
maxn=max(maxn,sum);
}
cout<<maxn;
return 0;
}