解题思路:

求解最多循环子串个数可以等效为求解最小循环子串的长度问题,只需要循环遍历子串长度从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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论