http://hihocoder.com/problemset/problem/1518
描述
给定一个1-N的排列A[1], A[2], ... A[N],定义集合S[K] = {A[K], A[A[K]], A[A[A[K]]] ... }。
显然对于任意的K=1..N,S[K]都是有限集合。
你能求出其中包含整数最多的S[K]的大小吗?
输入
第一行包含一个整数N。(1 <= N <= 100000)
第二行包含N个两两不同的整数,A[1], A[2], ... A[N]。(1 <= A[i] <= N)
输出
最大的S[K]的大小。
7 6 5 1 4 2 7 3样例输出
4
一开始做TLE,然后就想抱大腿搜题解,发现一个也没有,因为过的人就不多,然后想了一下从最后找,结果就AC了,不要问我问什么,感觉是,所以写一个这个题的第一个题解,希望有助于你们理解
TLE代码
#include<iostream>
#include<cstring>
#include<string>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
int n,i,l,a[100005],s[100005],p,maxn,cnt;
set<int>sett;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
maxn=0;
for(i=1;i<=n;i++)
{
sett.clear();
l=2;
p=a[i];
sett.insert(p);
cnt=sett.size();
while(l<=i)
{
sett.insert(a[p]);
l++;
p=a[p];
if(cnt==sett.size())
break;
cnt=sett.size();
}
cnt=sett.size();
if(maxn<cnt)
maxn=cnt;
}
printf("%d\n",maxn);
}
AC代码
#include<iostream>
#include<cstring>
#include<string>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
int n,i,l,a[100005],s[100005],p,maxn,cnt;
set<int>sett;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
maxn=0;
for(i=n;i>=1;i--)
{
sett.clear();
l=2;
p=a[i];
sett.insert(p);
cnt=sett.size();
while(l<=i)
{
sett.insert(a[p]);
l++;
p=a[p];
if(cnt==sett.size())
break;
cnt=sett.size();
}
cnt=sett.size();
if(maxn<cnt)
maxn=cnt;
else
break;
}
printf("%d\n",maxn);
}