A. Increasing Sequence
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int t,n;
//map<int,bool> mp;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
//mp.clear();
int a,x=1;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
if(x==a) x++;
x++;
}
printf("%d\n",x-1);
}
}
*B. Sets and Union
点击查看代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=55;
vector<int> num[maxn],s[maxn],st;
bool book[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,sz;
scanf("%d",&n);
for(int i=1;i<maxn;i++)
num[i].clear(),s[i].clear();
for(int i=1;i<=n;i++)
{
scanf("%d",&sz); int x;
for(int j=1;j<=sz;j++)
{
scanf("%d",&x);
num[x].push_back(i);
s[i].push_back(x);
}
}
int ans=0;
for(int i=1;i<maxn;i++)
{
if(num[i].size()==0) continue;
st.clear(); int x=1;
for(int i=1;i<maxn;i++) book[i]=false;
for(int j=0;j<num[i].size();j++)
{
while(x!=num[i][j]&&x<=n) st.push_back(x),x++;
x++;
}
while(x<=n) st.push_back(x),x++;
int ansi=0;
for(int j=0;j<st.size();j++)
{
for(int k=0;k<s[st[j]].size();k++)
{
if(book[s[st[j]][k]]) continue;
else book[s[st[j]][k]]=true,ansi++;
}
}
ans=max(ansi,ans);
}
printf("%d\n",ans);
}
return 0;
}
/*
// 错在:除了序列值完全相同的 Hash 值被删除,完全包含在被删除序列中的子序列对应的值也应被删除。
// 但只在序列长度最小的值中删值是错误的,因为我可能可以通过删除某些序列长度更大的值来得到答案。
const int base=353,MOD=998244353;
const int basei=1e6+7,MODI=1e9+7;
struct Hash_Table
{
ll xhash,hashi;
Hash_Table()
{
xhash=hashi=0;
}
bool operator == (Hash_Table a) const
{return a.xhash==xhash&&a.hashi==hashi;}
bool operator < (Hash_Table a) const
{return a.xhash+(ll)(1e9)*a.hashi<xhash+(ll)(1e9)*hashi;}
void init(vector<int> x)
{
ll cbase=base,cbasei=basei;
for(int i=0;i<x.size();i++)
xhash=(xhash+1ll*x[i]*cbase%MOD)%MOD,
hashi=(hashi+1ll*x[i]*cbasei%MODI)%MODI,
cbase=cbase*base%MOD,cbasei=cbasei*basei%MODI;
}
} Hash[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int ai,n,a,p=0,tot=0;
scanf("%d",&n);
for(int i=1;i<maxn;i++)
num[i].clear();
for(int i=1;i<=n;i++)
{
scanf("%d",&ai);
for(int j=1;j<=ai;j++)
scanf("%d",&a),
num[a].push_back(i);
}
memset(Hash,0,sizeof(Hash));
int minsize=maxn;
for(int i=1;i<maxn;i++)
if(num[i].size()==0) continue;
else ai=num[i].size(),minsize=min(minsize,ai);
for(int i=1;i<maxn;i++)
{
if(num[i].size()==0&&num[i].size()!=minsize) continue;
tot++,Hash[++p].init(num[i]);
}
sort(Hash+1,Hash+p+1);
int pi=1,delt=maxn;
while(pi<=p)
{
int pii=pi,x=0;
while(pii<=p&&Hash[pii]==Hash[pi])
x++,pii++;
delt=min(x,delt);
pi=pii;
}
printf("%d\n",tot-delt);
}
return 0;
}
*/