HDU-3374
String Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2057 Accepted Submission(s): 897
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.
1 1 6 1
1 6 1 6
1 3 2 3
/**
题意:给一个串,然后求串的最小表示法和最大表示法,并且输出有几个
做法:串的最小表示法 + KMP
**/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <map>
#define maxn 1000005
using namespace std;
int mmin, mmax;
int len;
char t1[maxn];
char str[maxn << ];
char t2[maxn];
void kmp_pre(char x[], int m, int nxt[])
{
int i, j;
j = nxt[] = -;
i = ;
while(i < m)
{
while(- != j && x[i] != x[j]) {
j = nxt[j];
}
nxt[++i] = ++ j;
}
}
int nxt[maxn];
int kmp_count(char x[], int m, char y[], int n)
{
int i, j;
int ans = ;
kmp_pre(x, m, nxt);
i = j = ;
while(i < n)
{
while(- != j && y[i] != x[j]) {
j = nxt[j];
}
i++;
j++;
while(j >= m)
{
ans ++;
j = nxt[j];
}
}
return ans;
}
void matchmin(char s[])
{
int i, j, k, l;
int N = len;
for(i = , j = ; j < N;)
{
for(k = ; k < N && s[i + k] == s[j + k]; k++);
if(k >= N) {
break;
}
if(s[i + k] < s[j + k]) {
j += k + ;
}
else
{
l = i + k;
i = j;
j = max(l, j) + ;
}
}
mmin = i + ;
}
void matchmax(char s[])
{
int i, j, k, l;
int N = len;
for(i = , j = ; j < N;)
{
for(k = ; k < N && s[i + k] == s[j + k]; k++);
if(k >= N) {
break;
}
if(s[i + k] > s[j + k]) {
j += k + ;
}
else
{
l = i + k;
i = j;
j = max(l, j) + ;
}
}
mmax = i + ;
}
int main()
{
while(~scanf("%s", str))
{
int n;
string tmp;
len = strlen(str);
for(int i = ; i < len; i++)
{
str[i + len] = str[i];
}
matchmin(str);
matchmax(str);
for(int i = ; i < len; i++)
{
t1[i] = str[i + mmin - ];
t2[i] = str[i + mmax - ];
}
int res1 = kmp_count(t1, len, str, len + len);
int res2 = kmp_count(t2, len, str, len + len);
if(mmin == ) {
res1 --;
}
if(mmax == ) {
res2 --;
}
printf("%d %d %d %d\n", mmin, res1, mmax, res2);
}
return ;
}
HDU-3374的更多相关文章
- 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+最大最小表示)
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 最小/大表示法+KMP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题意:给定一个串s,该串有strlen(s)个循环同构串,要求输出字典序最小的同构串的下标,字典 ...
- 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)
题目链接: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 循环节推导的证明相当 ...
- HDU 3374 String Problem (KMP+最大最小表示)
KMP,在有循环节的前提下: 循环节 t = len-next[len], 个数num = len/(len-next[len]);个人理解,如果有循环节,循环节长度必定小于等于len/2, 换句话说 ...
随机推荐
- css字体图标的制作和使用。
css字体图标的制作和使用. 在项目开发的过程中,我们会经常用到一些图标.但是我们在使用这些图标时,往往会遇到失真的情况,而且图片数量很多的话,页面加载就越慢.所以,我们可以使用字体图标的方式来显示图 ...
- C++的几种字符类型
我们在C学过了char字符类型. 在C++中,char是基本的字符类型,但却不仅仅有这一种字符类型! 类型 含义 该类型数据所占的最小比特位数 char 字符 8位(即可表示28个字符) wchar_ ...
- w命令集合
startx:在命令行模式下输入会进入图形界面 exit:注销Linux(以login shell登录会注销账号,以non-login shell登录会退出终端) data:显示日期和时间 data ...
- 安装一台Linux练习机前的考虑——主机规划与磁盘分区
要安装一台Linux主机并不是那么简单的事,我们必须要针对distributions的特性.服务器软件的能力.未来的升级需求.硬件扩充性需求等来考虑,对于磁盘分区.文件系统.Linux操作较频繁的目录 ...
- Daily Scrum02 11.30
纵然编译大作业压顶,大家还是顶住压力,保证了软工项目的持续进行. Member Today's Task Tomorrow's Task 李孟 Task856 熟悉单元测试方法熟悉单元测试方法 Tas ...
- chromium源码阅读--图片处理
JavaScript 图像替换 JavaScript 图像替换技术检查设备能力,然后“做正确的事”. 您可以通过 window.devicePixelRatio 确定设备像素比,获取屏幕的宽度和高度, ...
- PTA实验报告 数组
(第二张代码均为英红的代码) 题目1:题目名称:数组元素循环右移问题 1. 本题PTA提交列表 2. 设计思路(包括流程图) 将数组内每个位置移动,第2个放第一个,第三个放第二个,以此类推.使用两个循 ...
- 弹框中的elment-form在弹框重新打开后,怎么初始化验证信息
如果弹框关闭前有错误提示,弹框重新打开,由于没重新刷新页面,该错误还是存在.... 解决办法:弹框中的内容写成一个组件,prop接收父元素弹框的状态,并监听且reset表格 1. cnpm insta ...
- [剑指Offer] 29.最小的K个数
[思路1]全排序(快排)之后取出前K个数.O(K+nlogn) class Solution { public: vector<int> GetLeastNumbers_Solution( ...
- Hibernate映射关系之_多对多
多对多关系由于效率的原因,实际中会拆成相互的一对多的关系,不再累述