floyd判圈
老惯例,百度
Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),
是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,以及判断环的起点与长度的算法。
大概比方就是是,龟兔赛跑,兔子总比龟快,所以兔子一定领先,但如果路有圈,兔子就会追上龟,这时就确定有圈了。
UVA 11549
#include<iostream>
#include<set>
#include<map>
#include<cstdio>
#include<cstring>
using namespace std;
void gi(int &x)
{
int flag = 1;x = 0;char c = getchar();
while(c < '0'||c > '9'){if(c == '-') flag = -1;c = getchar();}
while('0' <= c&&c <='9')x = x*10+c-'0',c = getchar();
x *= flag;
}
int n,k;
int ss[50];
int next(int k){
long long L = (long long)k*k;
memset(ss,0,sizeof(ss));
int cnt = 0;
while(L){ss[cnt++] = L%10;L/=10;}
int m = min(cnt,n);
int ans = 0;
for(int i = 1;i <= m;i++)
ans = ans*10+ss[cnt-i];
return ans;
}
int main()
{
int T;
gi(T);
while(T--)
{
gi(n);gi(k);
int ans = k;
int k1 = k,k2 = k;
do{
k1 = next(k1);
k2 = next(k2);ans = max(ans,k2);
k2 = next(k2);ans = max(ans,k2);
}while(k1 != k2);
printf("%d\n",ans);
}
return 0;
}
当然,这时最基础的应用,后面的自动机方面的,等有能遇到这些问题的水平,估计这个算法yy一下就能再“发明”了吧。

浙公网安备 33010602011771号