这题要求的是字符串左移时字典序最小和最大的第几次出现,并求出现次数。考虑一会可以发现,出现次数和循环节是有关系的。

出现了几次,就是循环了几次,如果循环节是他本身,也就是无循环,那这个字符串不管怎么移,都只有一种情况。

关键就是求第几次出现,也就是最大最小的表示。顺便学习了一下。

#include<stdio.h>
#include<string.h>
#define maxn 1000010
int next_v[maxn],min,max;
char s[maxn];
void getnext_v()
{
int j,k,len=strlen(s);
j=;
k=-;
next_v[]=-;
while(j<len)
{
if(k==-||s[j]==s[k])
{
j++;
k++;
next_v[j]=k;
}
else k=next_v[k];
}
}
int get_min()
{
int i=,j=,k=,t,l=strlen(s);
while(i<l&&j<l&&k<l)
{
t=s[(j+k)%l]-s[(i+k)%l];
if(!t)
k++;
else
{
if(t>)
j=j+k+;
else
i=i+k+;
if(i==j)
j++;
k=;
}
}
return (i<j?i:j);
}
int get_max()
{
int i=,j=,k=,t,l=strlen(s);
while(i<l&&j<l&&k<l)
{
t=s[(j+k)%l]-s[(i+k)%l];
if(!t)
k++;
else
{
if(t<)
j=j+k+;
else
i=i+k+;
if(i==j)
j++;
k=;
}
}
return (i<j?i:j);
}
void kmp()
{
getnext_v();
int i,j,len=strlen(s),flag=;
int fl=len-next_v[len];
if(len%fl)
flag=;
min=get_min();
max=get_max(); if(flag)
{
printf("%d %d %d %d\n",min+,len/fl,max+,len/fl);
}
else
{
printf("%d 1 %d 1\n",min+,max+);
}
}
int main()
{
int i,j;
while(scanf("%s",s)!=EOF)
{
kmp();
}
}

hdu3374 KMP+最大最小表示法的更多相关文章

  1. bzoj5130 字符串的周期(kmp,最小表示法)

    bzoj5130 字符串的周期(kmp,最小表示法) bzoj 题解时间 m很大,n很小. 周期很容易求,就是kmp之后n-fail[n]. 之后对于枚举所有的字符串用最小表示法,暴力搜索. 能过就完 ...

  2. hdu3374 String Problem KMP+最大最小表示法

    Give you a string with length N, you can generate N strings by left shifts. For example let consider ...

  3. Manacher模板,kmp,扩展kmp,最小表示法模板

    *N]; //储存临时串 *N];//中间记录 int Manacher(char tmp[]) { int len=strlen(tmp); ; ;i<len;i++) { s[cnt++]= ...

  4. HDU3374 字符串最大最小表示法模板

    一开始没太看懂什么意思,拿笔反复推了一遍才大概知道最大最小表示法是怎么求的,感觉太神奇了... #include <iostream> #include <cstdio> #i ...

  5. hdu 3374 String Problem (kmp+最大最小表示法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:输出最大和最小的是从哪一位开始的,同时输出最小循环节的个数. 这里简单介绍对字符串最小 ...

  6. O - String Problem KMP 字符串最小表示法

    Give you a string with length N, you can generate N strings by left shifts. For example let consider ...

  7. hdu3374最小表示法+KMP

    题意:       给你一个最长100W的串,然后让你找到最小同构子串,还有最大同构子串的下标,最小同构子串就是把字符串连接成一个环,然后选择一个地方断开,得到的一个ASCII最小的子串(求最大同理) ...

  8. hdu3374 kmp+最小表示法

    Give you a string with length N, you can generate N strings by left shifts. For example let consider ...

  9. hdu-3374(kmp+最小表示法)

    题意:给你一个字符串,这个字符串我们可以把把他变成n个字符串按照以下规则:将当前字符串第一个放到字符串最后一位,字符串的下标依次向前推一位,比如:s[1] s[2 ]s[3] s[4]->s[2 ...

随机推荐

  1. 【温故而知新-CSS】使用CSS设计网站导航栏

    body #nav li a { width: auto; } #nav li a:hover { background-color: #ffcc00; color: #fff; border-rig ...

  2. HDU 4990 Ordered Subsequence --数据结构优化DP

    题意:给一串数字,问长度为m的严格上升子序列有多少个 解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数, 则有dp[i][j] = S ...

  3. POJ 1836 Alignment --LIS&LDS

    题意:n个士兵站成一排,求去掉最少的人数,使剩下的这排士兵的身高形成“峰形”分布,即求前面部分的LIS加上后面部分的LDS的最大值. 做法:分别求出LIS和LDS,枚举中点,求LIS+LDS的最大值. ...

  4. AC日记——神奇的幻方 洛谷 P2615(大模拟)

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  5. EasyUI中页面必须刷新才显示tree组件最新数据的BUG解决方案

    在URL地址后面加个时间戳,这样就避免从浏览器缓存里读取数据了 $("#devtree").tree({ url: '/Deviceinfo/ModelsTree.aspx?cmd ...

  6. p点到(a,b)点两所在直线的垂点坐标及p点是否在(a,b)两点所在直线上

     /// <summary>         ///  p点到(a,b)点两所在直线的垂点坐标         /// </summary>         /// <p ...

  7. php安全配置记录

    Php环境部署完成后,通常我们会进行一些安全设置.除了熟悉各种PHP漏洞外,还可以通过配置php.ini来加固PHP的运行环境.PHP官方也曾经多次修改php.ini的默认设置. 接下来,推荐php. ...

  8. 基于Microsoft Azure、ASP.NET Core和Docker的博客系统

    欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统   2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客 ...

  9. C语言 百炼成钢15

    //题目43:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出 //圈子,问最后留下的是原来第几号的那位. #include<stdio.h> #inclu ...

  10. Git基础 - git blame

    当想知道一段代码历史上有哪些人修改时,可以使用git blame查看,正如其名,当你看到那段让你抓狂的代码时,一定想找出是谁写的来一顿blame吧 : ) 使用方法 icebug@localhost: ...