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,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- cmake源码包安装后的卸载问题
cmake源码包安装 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程),具体学习请移步官网CMake 本文介绍的就是用cmake去安装的别人的包. 一般流程: ...
- 《网络对抗》Exp4 恶意代码分析
20155336<网络对抗>Exp4 恶意代码分析 问题回答 实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监 ...
- POJ 1459&&3436
两道比较基础的网络流题目,重点就是建图. 1458:题意就是给你一些东西它们的数据,其中一些是发电站,还有一些是用户的家里,其中还有一些是中转站.让你求最大的输送电量. 就是一道很基础的最大流题目,建 ...
- Luogu P1983 车站分级
(一周没写过随笔了) 这道题有坑! 看到题目,发现这么明显(??)的要求顺序,还有什么想法,拓扑! 将每条路范围内等级大于等于它的点(不能重复(坑点1))和它连一条边,注意起点终点都要有(坑点2),然 ...
- 自定义CCNode
对Touch事件的获取与处理可以使用CCLayer, CCMenuItem等,但是如果我们需要一个虚拟按键或者需要对特定精灵进行拖动等等,我们就需要自定义Touch类. 自定义Touch事件处理类重要 ...
- jqGrid 奇淫巧技
1.新建maven-web项目 结构如图 #GLOBAL_DIGITALMEDIA_SEARCH_grid-table > tbody > tr >td:last-child{ te ...
- java拦截器(Interceptor)学习笔记
1,拦截器的概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...
- java后台面试知识点总结
本文主要记录在准备面试过程中遇到的一些基本知识点(持续更新) 一.Java基础知识 1.抽象类和接口的区别 接口和抽象类中都可以定义变量,但是接口中定义的必须是公共的.静态的.Final的,抽象类中的 ...
- LAXCUS大数据操作系统节点挂掉后的处理
昨天回公司加班跑一个LAXCUS大数据应用,JVM直接挂了,没有留下任何异常信息,查看代码,也没有内存泄漏的问题.百思不得姐,只好去求教LAXCUS大数据操作系统的技术客服,客服查看了故障节点配置.日 ...
- Mac下搭建lamp
Mac下搭建lamp Mac 自带了Apache,并默认支持PHP环境,只需要配置Apache和PHP即可使用.需要单独安装mysql服务端. Apache 基础配置 Apache支持PHP配置 Ap ...