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,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- maven中添加jetty运行插件
maven项目,用jetty插件运行,对热部署的支持比较好.maven的pom文件加入下面代码 <plugin> <groupId>org.mortbay.je ...
- JavaEE笔记(十三)
#单一职责原则 一个类只做一件事 #开闭原则 拓展开,修改源码闭 #动态代理 1 基于接口的方式 jdk的动动代理2 基于类的方式 cglib的代理 #SSH整合 1.spring(容器) 1& ...
- HTML基础语法
目录 HTML基础语法 1.全局架构标签 2.标题 3.段落 4.文本 5.属性 6.链接 7.图片 8.列表 9.表格 10.区块 11.布局 12.表单 13.框架 14.头部 HTML基础语法 ...
- CF1096G Lucky Tickets
https://www.luogu.org/problemnew/show/CF1096G 显然dp出用\(\frac{n}{2}\)个数能拼出来的每个数的方案数,平方相加就行了,dp显然ntt+快速 ...
- Js_数组操作
用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一下狠心,我学!呵 ...
- 总结com组件问题,随笔记录
一.从 IClassFactory 为 CLSID 为 {00024500-0000-0000-C000-000000000046} 的 COM 组件创建实例失败,原因是出现以下错误:80010001 ...
- unity纯粹物理驱动方式
首先见官方文档 In most cases you should not modify the velocity directly, as this can result in unrealistic ...
- 【LeetCode】数组--合并区间(56)
写在前面 老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...
- linux一切皆文件之块设备文件(四)
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.块设备是 ...
- 了不起的Node.js--之三
开发工具: 我使用的开发工具是Mac版的WebStorm,这个工具支持Nodejs,只要按照如下步骤设置即可以支持 1.WebStorm的开发界面,这个开发工具还是非常好用的. 2.WebStorm的 ...