hdu3374

Solution:

最小表示法+KMP

设一个字符串S的最小循环节是T。(如S=“abababab”,则T=“ab”)

在最小循环节T中,只有1个最小字符串和最大字符串。则最小字符串的个数和最大字符串的个数相等,为|S|/|T|。

证明:

假设不成立,即在最小循环节T(T[0],T[1],...,T[m-1])[|T|=m]中,假设不止1个最小字符串。设其中两个为

T[x],T[(x+1)%m],…,T[(x-1)%m]

T[y],T[(y+1)%m],…,T[(y-1)%m]

两者相等。设z=y-x。对任意i,T[i]=T[(i+z)%m]=T[(i+z*2)%m]=...

对于z*p-m*q=r(p,q为整数),当z和m的最大公约数g=gcd(z,m)能整除r时,方程有解,即当r=k*gcd(z,m)(k为整数)时,方程有解。

因为y-x<m,所以gcd(z,m)小于m,且gcd(z,m)能被m整除。

对于任意i:

T[i]=T[(i+z*p)%m]=T[(i+g+m*q)%m]=T[(i+g)%m]=T[(i+g*2)%m]=...

所以

T[i]~T[(i+g-1)%m] ; T[(i+g)%m]~ T[(i+g*2-1)%m] ; ... ; T[(i+(m/g-1)*g)%m]~T[(i-1)%m] 为T的循环节,与上述T为最小循环节矛盾

所以假设不成立,最小循环节T中只有一个最小字符串

同理,最小循环节T中只有一个最大字符串

各种样例:

ababab

bababa

abcabcabc

acbacbacb

bacbacbac

bcabcabca

cabcabcab

cbacbacba

程序:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define max_len 1000000
  5.  
  6. char str[],str1[];
  7. long pre[];
  8.  
  9. long max(long a,long b)
  10. {
  11. if (a>b)
  12. return a;
  13. else
  14. return b;
  15. }
  16.  
  17. long min(long a,long b)
  18. {
  19. if (a>b)
  20. return b;
  21. else
  22. return a;
  23. }
  24.  
  25. int main()
  26. {
  27. long i,j,k,len,len1,posl,posr,count;
  28. while (scanf("%s",str)!=EOF)
  29. {
  30. len=strlen(str);
  31. //min
  32. i=;
  33. j=;
  34. while (i<len && j<len)
  35. {
  36. for (k=;k<len;k++)
  37. if (str[(i+k)%len]!=str[(j+k)%len])
  38. break;
  39. if (k==len)
  40. break;
  41. if (str[(i+k)%len]>str[(j+k)%len])
  42. i=max(i+k+,j+);
  43. else
  44. j=max(j+k+,i+);
  45. }
  46. posl=min(i,j);
  47.  
  48. //max
  49. i=;
  50. j=;
  51. while (i<len && j<len)
  52. {
  53. for (k=;k<len;k++)
  54. if (str[(i+k)%len]!=str[(j+k)%len])
  55. break;
  56. if (k==len)
  57. break;
  58. if (str[(i+k)%len]<str[(j+k)%len])
  59. i=max(i+k+,j+);
  60. else
  61. j=max(j+k+,i+);
  62. }
  63. posr=min(i,j);
  64. //最小字符串(模式串) len
  65. for (i=;i<len;i++)
  66. str1[i]=str[(posl+i)%len];
  67. //(目标串) 2*len
  68. for (i=;i<len-;i++)
  69. str[i+len]=str[i];
  70. len1=len*-;
  71. str[len1]='\0';
  72.  
  73. j=-;
  74. pre[]=-;
  75. //第0个数的前继为-1(第0个数前面没有数,-1代表没有)
  76. //从而i初始取1,否则i初始取0时,pre[0]=0,错误
  77. for (i=;i<len;i++)
  78. {
  79. while (j>- && str1[j+]!=str1[i])
  80. j=pre[j];
  81. if (str1[j+]==str1[i])
  82. j++;
  83. pre[i]=j;
  84. }
  85.  
  86. count=;
  87. j=-;
  88. for (i=;i<len1;i++)
  89. {
  90. while (j>- && str1[j+]!=str[i])
  91. j=pre[j];
  92. if (str1[j+]==str[i])
  93. j++;
  94. if (j==len-)
  95. {
  96. count++;
  97. j=pre[j];
  98. }
  99. }
  100. //最小串和最大串的数目相等
  101. printf("%ld %ld %ld %ld\n",posl+,count,posr+,count);
  102. }
  103. return ;
  104. }

hdu3374解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. 20155308《网络对抗》Exp4 恶意代码分析

    20155308<网络对抗>Exp4 恶意代码分析 实践说明 实践目标 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件: ...

  2. 【第三方插件】使用Topshelf创建Windows服务

    概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...

  3. 实践:IIS7下访问ashx页面,显示404

    问题描述 1.路径什么的都对,这方面的原因就不要想了 2.在我的电脑上可以,在同事的电脑上不可以 方案1:未注册ashx的处理应用程序 也就是不知道IIS不知道用什么应用程序处理ashx文件,解决办法 ...

  4. 《图说VR入门》——DeepoonVR的大鹏(陀螺仪)枪

    <图说VR入门>--VR大朋的(陀螺仪)枪 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/ar ...

  5. python基础学习1-变量定义赋值,屏幕输入输出

    一.变量定义赋值 输入输出屏幕显示 : name = input("input is your name") age =int( input("input is your ...

  6. python 回溯法 子集树模板 系列 —— 14、最长公共子序列(LCS)

    问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog ...

  7. SpringBoot配置Aop笔记【例子】

    众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...

  8. 我的小游戏上线海外AppStore完整流程心得

    1,购买一台Mac或者用VMWare 安装Mac OS流程,笔者使用VMWare. 先安装Mac OS 10.13,教程,成功后不要着急安装vmtools, 首先更新系统至最新版,因为真机测试往往需要 ...

  9. nginx转发swoole以及nginx负载

    nginx作为静态服务器同时转发swoole配置: location /{root //静态文件目录;index index.html index.htm;//默认首页 if(!-e $request ...

  10. JS基础(五)自定义函数

    作用:是为了让重复使用的语句,方便进行调用. 定义格式: function 自定义函数名 (参数1, 参数2,...) { 执行的语句 } 函数的封装:把语句放到函数中去的过程. 参数:通过参数的改变 ...