题目链接: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;
}

最新文章

  1. UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包
  2. Agile Software Development ——敏捷开发
  3. hdu 2187 悼念512汶川大地震遇难同胞——老人是真饿了
  4. 安装 openSUSE Leap 42.1 之后要做的 8 件事
  5. http协议学习系列
  6. JS面相对象
  7. ubuntu10.04开启root登陆
  8. 查看SQL语句执行时间
  9. Linux 权限基础说明
  10. 认识v$fixed_view_definition
  11. 《转》java动态代理(JDK和cglib)
  12. 翻译:使用 Redux 和 ngrx 创建更佳的 Angular 2
  13. JS解决通过按钮切换图片的问题
  14. Python线程的常见的lock
  15. windows + maven + eclipse
  16. python官网几个下载文件的区别
  17. [PHP] 工厂模式的日常使用
  18. ES6中字符串模板的使用
  19. gulp学习-metamask前端使用
  20. 【java】之深入理解JVM

热门文章

  1. Kubernetes容器集群管理环境 - 完整部署(中篇)
  2. Python 使用k-means方法将列表中相似的句子聚为一类
  3. java学习中碰到的疑惑和解答(二)
  4. TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)
  5. 8.8 day29 异常处理 UDP通信
  6. 自己实现spring核心功能 二
  7. Java虚拟机详解(五)------JVM参数(持续更新)
  8. oracle 正则表达的使用
  9. Hibernate自动执行更新方法
  10. Linux 使用命令 1