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

题意:给出一个字符串问这个字符串最小表示的最小位置在哪,还有有几个最小表示的串。最大表示的位置在哪,还有有几个最大

表示的串。

题解:就是最小表示求一下,最大表示求一下,然后在kmp计数一下就行。注意最小表示和最大表示求的时候一定要

增倍字符串。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int M = 2e6 + 10;
int Minnum(char s[] , int len)
{
int i = 0, j = 1, k = 0;
while(i < len && j < len && k < len)
{
int t = s[(i + k) % len] - s[(j + k) % len];
if(t == 0)
k++;
else {
if(t > 0)
i += k + 1;
else
j += k + 1;
if(i == j) j++;
k = 0;
}
}
return i < j ? i : j;
}
int Maxnum(char s[] , int len)
{
int i = 0, j = 1, k = 0;
while(i < len && j < len && k < len)
{
int t=s[(i + k) % len] - s[(j + k) % len];
if(t == 0)
k++;
else {
if(t > 0)
j += k + 1;
else
i += k + 1;
if(i == j) j++;
k = 0;
}
}
return i < j ? i : j;
}
char sl[M] , sm[M / 2] , sb[M / 2] , tmp[M / 2];
int Next[M / 2];
void getNext(char s[] , int m) {
int i = 0 , j = -1;
Next[0] = -1;
while(i < m) {
while(j != -1 && s[i] != s[j]) j = Next[j];
Next[++i] = ++j;
}
}
int kmp(char s[] , char p[] , int n , int m) {
getNext(p , m);
int ans = 0;
int i = 0 , j = 0;
while(i < n) {
while(j != -1 && s[i] != p[j]) j = Next[j];
i++ ; j++;
if(j >= m) {
ans++;
j = Next[j];
}
}
return ans;
}
int main() {
while(scanf("%s" , sl) != EOF) {
memcpy(tmp , sl , sizeof(sl));
strcat(sl , tmp);
int len = strlen(sl);
int Minpos = Minnum(sl , len) , Maxpos = Maxnum(sl , len);
int cnt = 0;
for(int i = Minpos ; i < len / 2 ; i++) {
sm[cnt++] = sl[i];
}
for(int i = 0 ; i < Minpos ; i++) {
sm[cnt++] = sl[i];
}
cnt = 0;
for(int i = Maxpos ; i < len / 2 ; i++) {
sb[cnt++] = sl[i];
}
for(int i = 0 ; i < Maxpos ; i++) {
sb[cnt++] = sl[i];
}
sm[cnt] = '\0';
sb[cnt] = '\0';
int ans1 = kmp(sl , sm , len - 1 , cnt);
int ans2 = kmp(sl , sb , len - 1 , cnt);
printf("%d %d %d %d\n" , Minpos + 1 , ans1 , Maxpos + 1 , ans2);
}
return 0;
}

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

  1. HDU - 3374:String Problem (最小表示法模板题)

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

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

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

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

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

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

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

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

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

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

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

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

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3374 [题目大意] 给出一个字符串,求出最小和最大表示是从哪一位开始的,并且输出数量. [题解] ...

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

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

  9. hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)

    Problem - 3374   KMP求循环节. http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html   循环节推导的证明相当 ...

随机推荐

  1. RocketMQ中Producer消息的发送

    上篇博客介绍过Producer的启动,这里涉及到相关内容就不再累赘了 [RocketMQ中Producer的启动源码分析] Producer发送消息,首先需要生成Message实例: public c ...

  2. Python开发异步任务Celery的使用教程!

    1. 生产者消费者设计模式 最常用的解耦方式之一,寻找中间人(broker)搭桥,保证两个业务没有直接关联.我们称这一解耦方式为:生产者消费者设计模式 2.中间人broker 示例:此处演示Redis ...

  3. Go组件学习——gorm四步带你搞定DB增删改查

    1.简介 ORM Object-Relationl Mapping, 它的作用是映射数据库和对象之间的关系,方便我们在实现数据库操作的时候不用去写复杂的sql语句,把对数据库的操作上升到对于对象的操作 ...

  4. 如何在Vue项目中使用vw实现移动端适配

    有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在< 使用Flexible实现手淘H5页面的终端适配>提出了Flexible的布局方案,随着 viewport 单位 ...

  5. 疯子的算法总结(二) STL Ⅰ 算法 ( algorithm )

    写在前面: 为了能够使后续的代码具有高效简洁的特点,在这里讲一下STL,就不用自己写堆,写队列,但是做为ACMer不用学的很全面,我认为够用就好,我只写我用的比较多的. 什么是STL(STl内容): ...

  6. [NUnit] discover test finished: 0 found issue

    %Temp%\VisualStudioTestExplorerExtensions & restart visual studio

  7. Java虚拟机学习笔记(二)--- 判断对象是否存活

    Java堆中存放着所有的对象实例,垃圾收集器在堆进行回收之前,需要判断对象是“存活”还是“死亡”(即不可能再被任何途径引用的对象). 最常见的一种判断对象是否存活算法是引用计数算法, 给对象加一个引用 ...

  8. iText实现pdf导出

    /** * AsianTest.java */ import java.io.FileOutputStream; import java.io.IOException; import com.lowa ...

  9. python环境的安装 环境变量和系统变量

    一.python 的安装 python 2.7 和 python 3.6的安装(一路点点点就行) 在安装的时候注意一下红框的内容,意思代表将其添加到环境变量中 环境变量是在操作系统中一个具有特定名字的 ...

  10. JavaScript数据结构——图的实现

    在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...