题目链接: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. Broadcast 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  2. 用HTML5的canvas做一个时钟

    对于H5来说,canvas可以说是它最有特色的一个地方了,有了它之后我们可以随意的在网页上画各种各样的图形,做一些小游戏啊什么的.canvas这个标签的用法,在网上也有特别多的教程了,这里就不作介绍了 ...

  3. java并发编程(三)----线程的同步

    在现实开发中,我们或多或少的都经历过这样的情景:某一个变量被多个用户并发式的访问并修改,如何保证该变量在并发过程中对每一个用户的正确性呢?今天我们来聊聊线程同步的概念. 一般来说,程序并行化是为了获得 ...

  4. 使用sublime调试node.js

    安装node相关 从node官网下载node的安装文件,我下的版本是node-v0.10.22-x64.exe,安装完node,node相关工具应该都加都环境变量path中了. 命令行下安装node- ...

  5. android——SQLite数据库存储(操作)

    public class MyDatabaseHelper extends SQLiteOpenHelper { //把定义SQL建表语句成字符串常量 //图书的详细信息 //ID.作者.价格.页数. ...

  6. java之面向对象详解

    #############java面向对象详解#############1.面向对象基本概念2.类与对象3.类和对象的定义格式4.对象与内存分析5.封装性6.构造方法7.this关键字8.值传递与引用 ...

  7. opencv3 编程入门学习笔记(一): 基本函数介绍

    滤波 blur (均值滤波) 均值滤波是典型的线性滤波算法, 主要方法为领域平均法(即用一片图像区域的各个像素的平均值来代替原图像中的各个像素值) 缺点: 不能很好的保护图像细节, 在图像去噪的同时也 ...

  8. Container killed by YARN for exceeding memory limits

    19/08/12 14:15:35 ERROR cluster.YarnScheduler: Lost executor 5 on worker01.hadoop.mobile.cn: Contain ...

  9. 利用QGIS下载地图数据

    这段时间做了一些利用地理信息进行定位导航的系列工作,其中很重要的一部分是如何获取到地图数据,比如道路的矢量图.某一区域的栅格图,我用到的主要工具是QGIS.QGIS是一个跨平台的免费应用,其中集成了对 ...

  10. 网站设计:将Footer固定在浏览器底部

    在设计网站的时候,如果你某个页面的内容没有满屏,那你的footer会离浏览器底部很远,整体看起来很难看,这里用JavaScript提供一种方法来将footer固定在浏览器底部. function fi ...