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一下就能再“发明”了吧。

posted @ 2017-05-24 20:46  rsqppp  阅读(103)  评论(0)    收藏  举报