hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int N = 1111111; 9 char buf[N]; 10 int next[N]; 11 12 void getNext(char *str) { 13 char *si = str; 14 int *ni = next; 15 int j = *next = -1; 16 while (*si) { 17 while (j > -1 && *si != *(str + j)) j = *(next + j); 18 si++, ni++, j++; 19 // if (*si == *(str + j)) *ni = *(next + j); 20 // else *ni = j; 21 *ni = j; 22 } 23 } 24 25 int minMaxExp(char *s, bool mini) { 26 int i = 0, j = 1, k = 0, t; 27 int len = strlen(s); 28 while (i < len && j < len && k < len) { 29 // cout << i << ' ' << j << ' ' << k << endl; 30 t = s[(i + k) % len] - s[(j + k) % len]; 31 if (!t) k++; 32 else { 33 if (mini ^ (t > 0)) j += k + 1; 34 else i += k + 1; 35 if (i == j) j++; 36 k = 0; 37 } 38 } 39 return min(i, j); 40 } 41 42 int main() { 43 while (cin >> buf) { 44 getNext(buf); 45 // for (int i = 0, sz = strlen(buf); i < sz; i++) cout << next[i] + 1 << ' '; cout << endl; 46 int cycle = strlen(buf); 47 // cout << "got next" << endl; 48 cycle /= (cycle - next[cycle - 1] - 1); 49 cout << minMaxExp(buf, true) + 1 << ' ' << cycle << ' ' << minMaxExp(buf, false) + 1 << ' ' << cycle << endl; 50 } 51 return 0; 52 }
View Code
转载于:https://www.cnblogs.com/LyonLys/p/hdu_3374_Lyon.html
hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)相关推荐
- HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)
题目链接:点击查看 题目大意:给出一个字符串,现在问字符串不断向左循环所能形成的n个字符串中,字典序最小和最大的字符串的编号为多少,分别有多少个 题目分析:字符串最小表示法的模板题,证明和模板都是看大 ...
- hdu 3746 kmp求循环节 下标从1开始
长度为m[1,2...m]的模式的循环节为 m-next[m] , aaa 循环节clc为1 (clc=m-next[m]= 3-2 =1) 此时 m%clc == 0 表示 ...
- HDU 3374 String Problem (KMP+最大最小表示)
KMP,在有循环节的前提下: 循环节 t = len-next[len], 个数num = len/(len-next[len]); 个人理解,如果有循环节,循环节长度必定小于等于len/2, 换句话 ...
- HDU-3374 String Problem (最小表示法)
题意:给你一个字符串,并让他不断的进行循环左移,问字典序最小的字符串是第几个,出现的次数是多少,最大的字符串是第几个,出现的次数是多少? 分析:最小字符串和最大字符串用最小表示法即可找到,出现的次数, ...
- hdu P3374 String Problem
今天又在lyk大佬的博客学会了--最小表示法(异常激动 发篇题解纪念一下 说在前面:给luogu提个建议最小表示法的题太少了,都被hdu抢去了!!! 我们先看一下题目 看完后可以用一个字概括--蒙,两 ...
- SZUACM集训字符串基础总结: 字符串最小表示 ,KMP, EXKMP, Manracher, Trie树,字符串的hash; 附带一写常见的运用技巧,邝斌大佬的板子和例题[持续更新]
第一部分 字符串的匹配<-------->KMP 模式匹配:子串的定位运算称为串的模式匹配或串匹配. 假设有两个串S,T,设S为主串,也称正文串,T为子串,也称为模式,在主串S中查找与模式 ...
- Problem A. MUV LUV EXTRA(kmp求最小循环节)
LINK 最小化 a ∗ p − b ∗ l a*p-b*l a∗p−b∗l 其中 p p p表示循环节总长, l l l表示循环节长度 若循环节从 i i i位置开始,那么一定需要延续到末尾 考虑固 ...
- hdu 3374 String Proble
kmp+最小表示法 #include<iostream> #define maxn 1000010 using namespace std; string str; int nextt[m ...
- HDU 3068 2017 Multi-University Training Contest - Team 1 1006 Fuction: 循环节+最后一步
题意:给出一个0..n-1的全排列a,给出一个0..m-1的全排列b,现在要求计算函数F(定义域0..n-1 值域0..m-1)的个数,使得对所有的0..n-1的 i 都有 F(i)=b(F(ai)) ...
最新文章
- java maven项目使用sonar审核代码
- Hash 函数资源链接汇总
- 几个重要的 ASM Disk Groups 参数
- python处理html的table标签
- html中的高和宽背景色怎么写,css background-size与背景图片填满div
- Celery 启动报错 can_read() got an unexpected keyword argument timeout
- 20145233 20145228《信息安全系统设计基础》第二次实验报告
- docker-compose 一键部署分布式配置中心Apollo
- Failed to issue method call Unit mysql service failed to lo
- 如何进行cad地理配准_【教程】自带高度建筑轮廓如何制作分色图
- 103-PHP定义一个类
- python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解
- 开发板添加上 Web 界面+openwrt luci界面修改
- 我的第一篇CSDN博客
- 算法:什么是宠物收养所问题?
- 音标、音节、音素、音符
- 前端监控SDK开发分享
- [XUPT_ACM]寒假第二次比赛题解
- 四个核心技术构成智能语音系统
- textpad和masm搭建汇编环境
热门文章
- 存储器的分配与回收算法实现_垃圾内存回收算法
- StringUtil中常用的方法
- java 多项式拟合最多的项数_机器学习(1)--线性回归和多项式拟合
- 使用python下载文件_详解使用Python下载文件的几种方法
- android 请求权限失败怎么办,java – Android HTTP POST请求错误 – 套接字失败EACCES(权限被拒绝)...
- 深入浅出全面解析RDMA
- 实现人脸识别性别之路---open CV将图片显示出来
- (转)在Eclipse中创建Maven多模块工程
- qq推广 qq在线客服工具
- Content Security Policy的学习理解