hdu 3374 String Problem(最小表示法+最大表示法+kmp)
题目链接: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)的更多相关文章
- HDU - 3374:String Problem (最小表示法模板题)
Give you a string with length N, you can generate N strings by left shifts. For example let consider ...
- HDU 3374 String Problem (KMP+最大最小表示)
HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others) Memory ...
- HDU - 3374 String Problem (kmp求循环节+最大最小表示法)
做一个高产的菜鸡 传送门:HDU - 3374 题意:多组输入,给你一个字符串,求它最小和最大表示法出现的位置和次数. 题解:刚刚学会最大最小表示法,amazing.. 次数就是最小循环节循环的次数. ...
- HDU 3374 String Problem(KMP+最大/最小表示)
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 3374 String Problem(kmp+最小表示法)
Problem Description Give you a string with length N, you can generate N strings by left shifts. For ...
- hdu 3374 String Problem (kmp+最大最小表示法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:输出最大和最小的是从哪一位开始的,同时输出最小循环节的个数. 这里简单介绍对字符串最小 ...
- HDU 3374 String Problem (KMP+最小最大表示)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3374 [题目大意] 给出一个字符串,求出最小和最大表示是从哪一位开始的,并且输出数量. [题解] ...
- HDU 3374 String Problem(KMP+最大(最小)表示)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:给出一个字符串,依次左移一个单位形成一堆字符串,求其字典序最小和最大的字符串需要左移多 ...
- hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)
Problem - 3374 KMP求循环节. http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html 循环节推导的证明相当 ...
随机推荐
- 用多个分隔符切分字符串---re.split()
问题/需求: 需要将字符串切分,但是分隔符在整个字符串中并不一致 (即:需要用多个分隔符切分字符串) str.split()方法不可行: 只支持单一分隔符,不支持正则及多个切割符号,不感知空格的数量 ...
- ORACLE 的CONNECT BY、START WITH,CONNECT_BY_ROOT、CONNECT_BY_ISLEAF、SYS_CONNECT_BY_PATH,LEVEL的使用(Hierarchical query-层次查询)
如果表中存在层次数据,则可以使用层次化查询子句查询出表中行记录之间的层次关系基本语法: START WITH <condition1> CONNECT BY [ NOCYCLE ] < ...
- 当下最流行的微服务与spring cloud,你搞清楚了吗?
微服务架构:Spring-Cloud 什么是微服务? 微服务就是把原本臃肿的一个项目的所有模块拆分开来并做到互相没有关联,甚至可以不使用同一个数据库. 比 如:项目里面有User模块和Power模块, ...
- java基本数据类型和包装类之间的区别
1.声明方式不同,基本类型不适用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间: 2.存储方式及位置不同,基本类型是直接将变量值存储在堆栈中,而包装类型是将对象放在堆中,然后通过引用 ...
- 基于http(s)协议的模板化爬虫设计
声明:本文为原创,转载请注明出处 本文总共三章,前面两章废话吐槽比较多,想看结果的话,直接看第三章(后续会更新,最近忙着毕设呢,毕设也是我自己做的,关于射频卡的,有时间我也放上来,哈哈). 一,系统总 ...
- Spring 常犯的十大错误,答应我 打死都不要犯好吗?
1. 错误一:太过关注底层 我们正在解决这个常见错误,是因为 “非我所创” 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理解特定库的内部结构及其实现, ...
- ccf 201903-3 损坏的RAID5
9月份考ccf,暑假打算做一些往年的真题... 这个题,一开始真是把我给看晕了 传说中的大模拟,果然不简单QAQ 首先读懂题目就是一个大难点,特别是对于我这种题目一长就看不进去的人来说 读懂题目之后, ...
- android ——Tablayout
Tabs make it easy to explore and switch between different views. 通过TabLayout可以在一个活动中通过滑动或者点击切换到不同的页面 ...
- 使用Qt5+CMake实现图片的区域选择(附源码)
近期研发涉及到了图片的区域选择,找来一些资料一直不能很满意,所以自己实现了一个. 实现步骤如下.源码可以点击ImageAOI获取. 如下资料来自源码的README. ImageAOI (XLabel) ...
- 在Vue 中使用Typescript
Vue 中使用 typescript 什么是typescript typescript 为 javaScript的超集,这意味着它支持所有都JavaScript都语法.它很像JavaScript都强类 ...