解题思路:
求解最多循环子串个数可以等效为求解最小循环子串的长度问题,只需要循环遍历子串长度从1到len/2的区间,若有解则输出len/最小子串长度,若无解则最小循环子串长度为len,最多循环子串个数为1;
注意事项:存储子串的数组区间大小要设置为2000000;
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MIN(a,b) (a<b?a:b)
int main()
{
char str[1000001], str1[2000001];
while (scanf("%s", str) && strcmp(str, ".") != 0)
{
int result = 1;
int a[1000001] = { 0 };
int len = strlen(str);
for (int i = 1; i <= len / 2; i++)
{
int dg = 0;
if (len%i == 0 && a[i] == 0)
{
memset(str1, 0, sizeof(char) * 2000001);
strncpy(str1, str, i);
while (1)
{
strncat(str1, str,strlen(str1));
if (strncmp(str1, str, MIN(strlen(str1), len)) != 0)break;
else
{
if (strlen(str1) >= len)
{
dg = i;
break;
}
else a[strlen(str1)] = 1;
}
}
}
if (dg != 0)
{
result = len / dg;
break;
}
}
printf("%d\n", result);
}
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复