hdu3374解题报告
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解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- 20155317 十六周second 取值
20155317 十六周second 取值 题目如下图: secondset #define base 0xFFFFC0000 # #define &clock void setsecond( ...
- Linux随笔---tar命令
一.解压 语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用. 主选项:c:create:v:verbose: ...
- Kubernetes学习之路(二十)之K8S组件运行原理详解总结
目录 一.看图说K8S 二.K8S的概念和术语 三.K8S集群组件 1.Master组件 2.Node组件 3.核心附件 四.K8S的网络模型 五.Kubernetes的核心对象详解 1.Pod资源对 ...
- 微信小程序实现各种特效实例
写在前面 最近在负责一个微信小程序的前端以及前后端接口的对接的项目,整体上所有页面的布局我都已经搭建完成,里面有一些常用的特效,总结一下,希望对大家和我都能有所帮助 实例1:滚动tab选项卡 先看一下 ...
- java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除
最近在做一个项目,需要实现这几项功能,上网查了很多资料,自己研究了好几天终于实现了,现在与大家分享一下. 一.JAVA实现文件夹的搜索 在百度搜索N个技术文章,从哪些大牛们共享的资料中终于写出了我 ...
- android studio 下载 sdk 失败
android studio 打开项目出现以下错误时,点击去安装,会提示"All packages are not available for download" 错误. 解决办法 ...
- docker 部署Spring Boot:Docker化Spring Boot应用程序
第一章 1.创建项目存放目录 mkdir /root/sproot -p 2.准备好Spring Boot应用程序 jar 包 testrest.jar 第二章 1. 安装docker 在所有节点执行 ...
- 2019大疆PC软件开发笔试——开关和灯泡两个电路板
题目描述: 小A是一名DIY爱好者,经常制作一些有趣的东西. 今天,小A突然想要来做这样一个东西.小A现在有两块同样大小为n×m,有n×m块大小为1×1小电路板拼成的矩形电路板,假设叫做电路板A和电路 ...
- linux gcc编译多个源文件的方法
http://blog.csdn.net/yinjiabin/article/details/7731817
- About The Algorithm Simplification
For mode 1, you have to ergod all the data in the files. So the key point to solve this problem is t ...