题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374

题目大意:输出最大和最小的是从哪一位开始的,同时输出最小循环节的个数。

这里简单介绍对字符串最小表示的方法:

(1)  利用两个指针p1, p2。初始化时p1指向s[0], p2指向s[1]。

(2)  k = 0开始,检验s[p1+k] 与 s[p2+k] 对应的字符是否相等,如果相等则k++,一直下去,直到找到第一个不同,(若k试了一个字符串的长度也没找到不同,则那个位置就是最小表示位置,算法终止并返回)。则该过程中,s[p1+k] 与 s[p2+k]的大小关系,有三种情况:

(A). s[p1+k] > s[p2+k],则p1滑动到p1+k+1处 --- 即s1[p1->p1+k]不会是该循环字符串的“最小表示”的前缀。 k置为0

(B). s[p1+k] < s[p2+k],则p2滑动到p2+k+1处, k置为0

(C). s[p1+k] = s[p2+k],则 k++; if (k == len) 返回结果。

注:这里滑动方式有个小细节,若滑动后p1 == p2,将正在变化的那个指针再+1。直到p1、p2把整个字符串都检验完毕,返回两者中小于 len 的值。

(3)   如果 k == len, 则返回p1与p2中的最小值

最大和最小表示完全类似,简单的改变一下即可。下面详见代码。

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int next[],len,t;
char ch[]; void get_next()
{
int i=,j=-;
next[]=-;
while (i<len)
{
if (j==-||ch[i]==ch[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
} int Min_(char s[],int len)
{
int p1=,p2=,k=;
while (p1<len&&p2<len&&k<len)
{
t=s[(p1+k)%len]-s[(p2+k)%len];
if (t==)
k++;
else
{
if (t>)
p1=p1+k+;
else
p2=p2+k+;
if (p1==p2)
p2++;
k=;
}
}
return min(p1,p2);
} int Max_(char s[],int len)
{
int p1=,p2=,k=;
while (p1<len&&p2<len&&k<len)
{
t=s[(p1+k)%len]-s[(p2+k)%len];
if (t==)
k++;
else
{
if (t>)
p2=p2+k+;
else
p1=p1+k+;
if (p1==p2)
p2++;
k=; }
}
return p1<p2?p1:p2;
} int main()
{
while(~scanf("%s",ch))
{
len=strlen(ch);
get_next();
int Max=Max_(ch,len);
int Min=Min_(ch,len);
//cout<<Max<<Min<<endl;
int sum=;
if(len%(len-next[len])==)
sum=len/(len-next[len]);
else
sum=;
printf ("%d %d %d %d\n",Min+,sum,Max+,sum);
}
return ;
}

hdu 3374 String Problem (kmp+最大最小表示法)的更多相关文章

  1. HDU 3374 String Problem(KMP+最大(最小)表示)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:给出一个字符串,依次左移一个单位形成一堆字符串,求其字典序最小和最大的字符串需要左移多 ...

  2. HDU 3374 String Problem (KMP+最大最小表示)

    KMP,在有循环节的前提下: 循环节 t = len-next[len], 个数num = len/(len-next[len]);个人理解,如果有循环节,循环节长度必定小于等于len/2, 换句话说 ...

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

    Problem Description Give you a string with length N, you can generate N strings by left shifts. For ...

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

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

  5. HDU 3374 String Problem(最大最小表示+KMP)题解

    题意:给你一个字符串,这个字符串可以这样操作:把第一个字符放到最后一个形成一个新的字符串,记原式Rank为1,每操作一步Rank+1,问你这样操作得出的最小字典序的字符串的Rank和这样的字符串有几个 ...

  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. HDU 3374 String Problem (KMP+最大最小表示)

    HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  8. HDU 3374 String Problem(KMP+最大/最小表示)

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. HDU - 3374 String Problem (kmp求循环节+最大最小表示法)

    做一个高产的菜鸡 传送门:HDU - 3374 题意:多组输入,给你一个字符串,求它最小和最大表示法出现的位置和次数. 题解:刚刚学会最大最小表示法,amazing.. 次数就是最小循环节循环的次数. ...

  10. HDU 3374 String Problem

    最大最小表示法与KMP求循环节 最大最小表示法 最大最小表示法与KMP求循环节的模板题, #include <iostream> #include <cstdio> #incl ...

随机推荐

  1. jmeter多用户登录跨线程组操作传值

    项目需求: 需要登录两个用户A.B,用户A操作完后会通知B,然后B再操作,B操作完结束或者再通知A. 实现思路: 1. 设置两个线程组Ⅰ.Ⅱ,组Ⅰ添加cookie管理器,里面添加用户A的操作:组Ⅱ添加 ...

  2. Asp.NET Core2.0与 EF的ABP框架入门视频教程

    https://ke.qq.com/course/287301?from=qqchat&ADUIN=1187219916&ADSESSION=1522716499&ADTAG= ...

  3. 「日常训练」 Soldier and Traveling (CFR304D2E)

    题意 (CodeForces 546E) 对一个无向图,给出图的情况与各个节点的人数/目标人数.每个节点的人只可以待在自己的城市或走到与他相邻的节点. 问最后是否有解,输出一可行解(我以为是必须和答案 ...

  4. font and face, 浅探Emacs字体选择机制及部分记录

    缘起 最近因为仰慕org-mode,从vim迁移到了Emacs.偶然发现org-mode中调出的calendar第一行居然没有对齐,排查一下发现是字体的问题.刚好也想改改Emacs的字体,于是我就开始 ...

  5. Python 3 学习笔记之——数据类型

    1. 数字 类型 int, float, bool, complex type() 查看变量类型 isinstance(a, int) 查看变量类型 运算符 % 取余 // 返回商的整数部分 ** 幂 ...

  6. JQuery Ajax执行过程AOP拦截

    JQuery Ajax过程AOP:用于在Ajax请求发送过程中执行必备操作,比如加载数据访问令牌. $.ajaxSetup({ type: "POST", error: funct ...

  7. 从微软msdn阅读事件的使用

    微软文章:如何:在 Windows 窗体应用程序中使用事件 地址:https://msdn.microsoft.com/zh-cn/library/0y0987sc.aspx 文章:C#事件的订阅与触 ...

  8. 【工具学习】——教你读懂Maven的配置文件

    [前言] 最近在项目中用到了maven工具,相信很多第一次接触maven的人都有这样的困惑,maven的文件很简单,就像下图中的结构一样,但是它的功能十分强大,那是怎么做到的呢?配置文件!配置文件里是 ...

  9. user32的使用

    通过代码查询特定的窗口,并在文本框中输入文字然后单击"OK"按钮 需要查找的Dialog 使用Spy++查看窗口信息 通过代码实现功能 class Program { //defi ...

  10. 【BZOJ 1146】[CTSC2008]网络管理Network

    树剖+树状数组套线段树O(nlogn^3)(我打的),有一种更加优秀的算法是O(nlogn^2)的就是直接树状数组套线段树欧拉序(并不快),或者是用主席树维护原始的树的信息,同时用树状数组套线段树维护 ...