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

程序:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max_len 1000000 char str[],str1[];
long pre[]; long max(long a,long b)
{
if (a>b)
return a;
else
return b;
} long min(long a,long b)
{
if (a>b)
return b;
else
return a;
} int main()
{
long i,j,k,len,len1,posl,posr,count;
while (scanf("%s",str)!=EOF)
{
len=strlen(str);
//min
i=;
j=;
while (i<len && j<len)
{
for (k=;k<len;k++)
if (str[(i+k)%len]!=str[(j+k)%len])
break;
if (k==len)
break;
if (str[(i+k)%len]>str[(j+k)%len])
i=max(i+k+,j+);
else
j=max(j+k+,i+);
}
posl=min(i,j); //max
i=;
j=;
while (i<len && j<len)
{
for (k=;k<len;k++)
if (str[(i+k)%len]!=str[(j+k)%len])
break;
if (k==len)
break;
if (str[(i+k)%len]<str[(j+k)%len])
i=max(i+k+,j+);
else
j=max(j+k+,i+);
}
posr=min(i,j);
//最小字符串(模式串) len
for (i=;i<len;i++)
str1[i]=str[(posl+i)%len];
//(目标串) 2*len
for (i=;i<len-;i++)
str[i+len]=str[i];
len1=len*-;
str[len1]='\0'; j=-;
pre[]=-;
//第0个数的前继为-1(第0个数前面没有数,-1代表没有)
//从而i初始取1,否则i初始取0时,pre[0]=0,错误
for (i=;i<len;i++)
{
while (j>- && str1[j+]!=str1[i])
j=pre[j];
if (str1[j+]==str1[i])
j++;
pre[i]=j;
} count=;
j=-;
for (i=;i<len1;i++)
{
while (j>- && str1[j+]!=str[i])
j=pre[j];
if (str1[j+]==str[i])
j++;
if (j==len-)
{
count++;
j=pre[j];
}
}
//最小串和最大串的数目相等
printf("%ld %ld %ld %ld\n",posl+,count,posr+,count);
}
return ;
}

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. 编译安装php时遇到virtual memory exhausted: Cannot allocate memory

    有时候用vps建站时需要通过编译的方式来安装主机控制面板.对于大内存的VPS来说一般问题不大,但是对于小内存,比如512MB内存的godaddy VPS来说,很有可能会出现问题,因为编译过程是一个内存 ...

  2. Spring Boot(十二):Spring Boot 如何测试打包部署

    有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 ...

  3. spring boot 实现文件下载

    html 代码 js部分 window.location.href= this.Baseurl+'/plan/down?file='+filename; spring boot 后台代码@GetMap ...

  4. docker之故障问题解决方案

    1.报错如下一 Error response from daemon: driver failed programming external connectivity on endpoint lnmp ...

  5. 利用HOG+SVM实现行人检测

    利用HOG+SVM实现行人检测 很久以前做的行人检测,现在稍加温习,上传记录一下. 首先解析视频,提取视频的每一帧形成图片存到磁盘.代码如下 import os import cv2 videos_s ...

  6. LeetCode 9. Palindrome Number(回文数)

    Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same back ...

  7. 如何基于 K8S 多租能力构建 Serverless Container

    当前 Kubernetes 已经成为名副其实的企业级容器编排规范,很多云平台都开始提供兼容 Kubernetes 接口的容器服务.而在多用户支持方面,多数平台选择直接提供专属虚机集群,用户需要花费大量 ...

  8. LeetCode-37.解数独

    编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 ...

  9. 机器学习之线性回归使用Python和tensorflow实现

    导入依赖包 import tensorflow as tf import numpy as np import matplotlib.pylab as plt from pylab import mp ...

  10. hive insert 动态分区异常(Error encountered near token)与解决

    当insert数据到有分区的hive表里时若不明显指定分区会抛出异常 insert overwrite table persons_tmp select * from persons; FAILED: ...