AcWing 141. 周期(最小循环节)

题目链接:点击这里

在这里插入图片描述
在这里插入图片描述

#include<iostream>

using namespace std;

const int N = 1000010;

int n;
char str[N];
int Next[N];

void get_next()
{
	for(int i = 2, j = 0; i <= n; ++i)
	{
		while(j>0&&str[i]!=str[j+1])	j = Next[j];
		if(str[i]==str[j+1])	j++;
		Next[i] = j;
	}
}

int main()
{
	int t = 1;
	while(scanf("%d", &n), n)
	{
		scanf("%s", str+1);
		get_next();
		printf("Test case #%d\n", t++);
		
		for(int i = 2; i <= n; ++i)
		{
			int t = i - Next[i];
			if(t!=i&&i%t==0)
				printf("%d %d\n", i, i/t);
		}
		printf("\n");
	}
	return 0;
}
发布了727 篇原创文章 · 获赞 111 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104277043
今日推荐