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

题意:给定一个串s,该串有strlen(s)个循环同构串,要求输出字典序最小的同构串的下标,字典序最小的出现次数,最大的同构串的下标,字典中最大的出现次数。

思路:对于求循环同构的字典序最小可以用最小表示法求得,最大也是一样。然后设ds为字符串s+s。然后就可以用KMP求最小串在ds出现的次数和最大串出现的次数了。

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
const int MAXN = + ;
typedef long long int LL;
#define INF 0x3f3f3f3f
int Representation(char *s,int l,bool flag){ //flag:0 最小表示法 flag:1 最大表示法
int i = , j = , k = ;
while (i < l&&j < l&&k < l){
int li, lj;
li = (i + k) >= l ? i + k - l : i + k;
lj = (j + k) >= l ? j + k - l : j + k;
if (s[li] == s[lj]){
k++;
}
else{
if (!flag){
if (s[li]>s[lj]){
i = i + k + ;
}
else{
j = j + k + ;
}
}
else{
if (s[li]<s[lj]){
i = i + k + ;
}
else{
j = j + k + ;
}
}
if (i == j){
j++;
}
k = ;
}
}
return i < j ? i : j;
}
int Next[MAXN];
void getnext(char *s,int lens){ //KMP的next数组
int j, k;
j = ; k = -; Next[] = -;
while (j < lens){
if (k == - || s[j] == s[k]){
Next[++j] = ++k;
}
else{
k = Next[k];
}
}
}
int KMP_Count(char *s,int lens,char *t,int lent){ //计算t串在s串中出现的次数
int ans = , j = ;
memset(Next, , sizeof(Next));
getnext(t,lent);
for (int i = ; i < lens; i++){
while (j> && s[i] != t[j]){
j = Next[j];
}
if (s[i] == t[j]){
j++;
}
if (j == lent){
ans++;
j = Next[j];
}
}
return ans;
}
char str[MAXN], dstr[MAXN*],minstr[MAXN],maxstr[MAXN];
//原串,原串*2后的串,字典序最小的串,字典序最大的串
int main()
{
while (~scanf("%s", str)){
int len = strlen(str);
for (int i = ; i < len * ; i++){
dstr[i] = str[(i%len)];
}
//计算最小
int minstart = Representation(str, len,);
for (int i = ; i < len; i++){
minstr[i] = str[(i + minstart) % len];
}
int mincount = KMP_Count(dstr, len * - , minstr, len);
//计算最大
int maxstart = Representation(str, len,);
for (int i = ; i < len; i++){
maxstr[i] = str[(i + maxstart) % len];
}
int maxcount = KMP_Count(dstr, len * - , maxstr, len);
printf("%d %d %d %d\n", minstart + ,mincount , maxstart + , maxcount);
}
return ;
}

HDU 3374 最小/大表示法+KMP的更多相关文章

  1. 【HDU3374】 String Problem (最小最大表示法+KMP)

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

  2. kuangbin专题十六 KMP&&扩展KMP HDU3347 String Problem(最小最大表示法+kmp)

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

  3. String Problem hdu 3374 最小表示法加KMP的next数组

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

  4. HDU 3374 exkmp+字符串最大最小表示法

    题意 找到一个字符串中最先出现的最小(大)表示位置,和最小(大)表示串出现次数 分析 用最小(大)表示法求出最先出现的最小(大)表示位置,然后将串长扩两倍用exkmp找出现次数. Code #incl ...

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

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

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

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

  7. Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)

    题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...

  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+最小最大表示)

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

随机推荐

  1. Spring JMS ActiveMQ整合(转)

    转载自:http://my.oschina.net/xiaoxishan/blog/381209#comment-list ActiveMQ学习笔记(四)http://my.oschina.net/x ...

  2. 【网络】VPN和代理服务器的区别

    来自:http://www.zhihujingxuan.com/19311.html [scotttony的回答(41票)]: VPN和ssh哪个比较好, 要看你怎么定义是“好”. ssh作为一个创建 ...

  3. python安装paramiko模块

    一.简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  4. net 页面跳转

    前台: < a href="xx.html" target="_blank"> 后台: Response.Redirect("XXX.as ...

  5. 统计 F-test 和 T-test

    1 显著性差异 如果样本足够大,很容易有显著性差异.样本小,要有显著性差异很难. y是因变量,x是自变量 2 F-test与T-test Ftest也称ANOVA,是用来检测一个y下的不同level的 ...

  6. Swing开发之JComboBox篇

    http://blog.csdn.net/sjf0115/article/details/6991579

  7. Android 更改字体

    1. 将字体ttf文件放在assets目录下 2. 使用: Typeface mTypeFaceLight = Typeface.createFromAsset(context.getAssets() ...

  8. Bootstrap学习(一)

    Bootstrap就是对jQuery的一次再开发,所以jQuery脚本引用必须在bootstrap脚本之前. 链接:http://www.cnblogs.com/vvjiang/p/5189804.h ...

  9. lnmp初步学习知识整理

    Linux常用30个命令 1.帮助命令 1) man 就是manual的缩写,用来查看系统中自带的各种参考手册(一般linux系统中自带英文手册)! man 命令名 //查看该命令的介绍 2) 命令名 ...

  10. sql server 本地复制订阅 实现数据库服务器 读写分离(转载)

    转载地址:http://www.cnblogs.com/echosong/p/3603270.html 再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下S ...