博客
关于我
HDU——3374 String Problem (最大最小表示法+循环节+kmp)
阅读量:508 次
发布时间:2019-03-07

本文共 2115 字,大约阅读时间需要 7 分钟。

Give you a string with length N, you can generate N strings by left shifts. For example let consider the string “SKYLONG”, we can generate seven strings: 

String Rank 
SKYLONG 1 
KYLONGS 2 
YLONGSK 3 
LONGSKY 4 
ONGSKYL 5 
NGSKYLO 6 
GSKYLON 7 
and lexicographically first of them is GSKYLON, lexicographically last is YLONGSK, both of them appear only once. 
  Your task is easy, calculate the lexicographically fisrt string’s Rank (if there are multiple answers, choose the smallest one), its times, lexicographically last string’s Rank (if there are multiple answers, choose the smallest one), and its times also. 

Input

  Each line contains one line the string S with length N (N <= 1000000) formed by lower case letters.

Output

Output four integers separated by one space, lexicographically fisrt string’s Rank (if there are multiple answers, choose the smallest one), the string’s times in the N generated strings, lexicographically last string’s Rank (if there are multiple answers, choose the smallest one), and its times also.

Sample Input

abcderaaaaaaababab

Sample Output

1 1 6 11 6 1 61 3 2 3

题意:求最大最小表示法,就是求一个字符串,输出左移补在右边的字典序最大和最小的下标和最小循环节循环的次数(输出一个下标输出一个次数)比如说样例第一个:

生成的字符串有:

1.abcder   2.bcdera  3.cderab  4.derabc  5.eabcdr  6.rabcde  所以字典序最小的是1  然后循环节次数是 1  然后字典序最大是6 然后循环节次数是 1  所以输出 1 1 6 1

题解:可以看出循环节循环次数,不论字典序最大还是最小,都是一样的~~这样利用 len/(len-nexts[len])就求出最小循环节循环次数了~~(len-nexts[len])它是最小循环节~然后最小最大的下标就用模板跑一下就好了~~上代码:

#include 
#include
using namespace std;const int MAX = 1e6+10;char str[MAX];int nexts[MAX];int len;void getnexts(){//nexts[]模板(KMP) //memset(nexts,0,sizeof(nexts));//初始,不初始化都对,还没碰上有错的 int i,j; i=j=0; nexts[0]=-1; j=-1; while(i
0) i+=k+1; else j+=k+1; if(i==j) j++; k=0; } } return min(i+1,j+1);}int posmax(int len){//最大表示法模板 int i=0,j=1,k=0; while(i
0) j+=k+1; else i+=k+1; if(i==j) j++; k=0; } } return min(i+1,j+1);}int main(){ while(~scanf("%s",str)){ len=strlen(str); getnexts(); int ci=len/(len-nexts[len]);//循环次数 cout << posmin(len) << " " << ci << " " << posmax(len) << " " << ci << endl; } return 0;}

 

转载地址:http://suqjz.baihongyu.com/

你可能感兴趣的文章
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>
MySQL 的Rename Table语句
查看>>
MySQL 的全局锁、表锁和行锁
查看>>
mysql 的存储引擎介绍
查看>>
MySQL 的存储引擎有哪些?为什么常用InnoDB?
查看>>
Mysql 知识回顾总结-索引
查看>>
Mysql 笔记
查看>>
MySQL 精选 60 道面试题(含答案)
查看>>
mysql 索引
查看>>
MySQL 索引失效的 15 种场景!
查看>>
MySQL 索引深入解析及优化策略
查看>>
MySQL 索引的面试题总结
查看>>
mysql 索引类型以及创建
查看>>
MySQL 索引连环问题,你能答对几个?
查看>>
Mysql 索引问题集锦
查看>>
Mysql 纵表转换为横表
查看>>
mysql 编译安装 window篇
查看>>
mysql 网络目录_联机目录数据库
查看>>
MySQL 聚簇索引&&二级索引&&辅助索引
查看>>
Mysql 脏页 脏读 脏数据
查看>>