Floyd判圈算法
对于一个有环的链表,我们可以通过把他的各个值打一个hash来判重,但是有的时候,空间上往往不允许我们这样做。
为此我们可以使用FLoyd判圈算法(又称:龟兔赛跑算法),即选定一个起点,然后让两个值分别迭代,一个每次“跑”一次,另一个“跑”两次,只要跑道有环,它们就一定可以相遇。
这样就把空间复杂度压到了O(1)
以UVa - 11549为例:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define rep(i,x,y) for (int i=x;i<=y;i++)
#define dep(i,y,x) for (int i=y;i>=x;i--)
#define read(x) scanf("%lld",&x)
using namespace std;
long long n,a,b,t,up,k,ans;
int next(long long n,long long k)
{
long long l=k*k;
while (l>=up) l/=10;
return l;
}
int main()
{
read(t);
while (t--)
{
scanf("%lld%lld",&n,&k);
up=1;
rep(i,1,n) up*=10;
if (!k) {printf("%d\n",0);continue;}
a=k;
b=next(n,k);
ans=max(a,b);
while (a!=b)
{
a=next(n,a); //走一步
b=next(n,b); ans=max(b,ans); //走一步
b=next(n,b); ans=max(b,ans); //再走一步
}
printf("%lld\n",ans);
}
return 0;
}