每次高兴才算高兴的话
其实就是对于一段连续的查询操作统计答案时最多只能统计一次
所以对于一段连续的查询操作中任意两点连边所形成的图的 补集的最大团就是答案
之后利用最大团的随机算法就好
至于随机算法证明我就只能告诉你应该和概率相关,具体不会证明
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[50],b[50],tot;
bool vis[50][50];
string ss;
map<string,int>mp;
bitset<50>s,ans;
void work1()
{
for (int i=1; i<=a[0]; i++)
{
for (int j=i+1; j<=a[0]; j++)
vis[a[i]][a[j]]=vis[a[j]][a[i]]=false;
}
a[0]=0;
}
void work2()
{
if (!mp.count(ss)) mp[ss]=++tot;
a[++a[0]]=mp[ss];
}
int main()
{
scanf("%d%d",&n,&m);
memset(vis,true,sizeof(vis));
for (int i=1; i<=n; i++)
{
int type;
scanf("%d",&type);
if (type==1) work1();
else cin>>ss,work2();
}
work1();
int T=5e4;
for (int i=1; i<=m; i++) b[i]=i;
while (T--)
{
random_shuffle(b+1,b+m+1);
for (int i=1; i<=m; i++) s[i]=1;
for (int i=1; i<=m; i++)
{
if (s[b[i]]==1)
{
for (int j=i+1; j<=m; j++)
{
if (!vis[b[i]][b[j]]) s[b[j]]=0;
}
}
}
if (s.count()>ans.count()) ans=s;
}
cout<<ans.count()<<endl;
}