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, 换句话说 ...
随机推荐
- Android stateMachine分析
StateMachine与State模式的详细介绍可以参考文章:Android学习 StateMachine与State模式 下面是我对于StateMachine的理解: 先了解下消息处理.看下Sta ...
- truffle开发一个简单的Dapp
1.安装Truffle:npm install -g truffle 2.建立项目目录并进入:mkdir pet-shop-tutorial cd pet-shop-tutorial 3.使用truf ...
- 【ZJ选讲·字符串折叠】
给一个字符串(len<=100) 把这个字符串折叠(就是压缩) 记 X(子串) 表示重复 X次该子串 比如 3(orz) orzorzorz 来点神奇例子: AAAAAAAAAA ...
- MySQL:BlackHole
MySQL:BlackHole 顾名思义BlackHole就是黑洞,只有写入没有输出.现在就来实验一下吧 首先查看一下MySQL支持的存储引擎 mysql> show engines;+---- ...
- HAOI2006 均分数据 [模拟退火]
题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...
- Codeforces Round #525 (Div. 2)B. Ehab and subtraction
B. Ehab and subtraction 题目链接:https://codeforc.es/contest/1088/problem/B 题意: 给出n个数,给出k次操作,然后每次操作把所有数减 ...
- Sync Data to AWS S3 on Windows Box
1. Install AWS CLI first, windows download link https://s3.amazonaws.com/aws-cli/AWSCLI64.msi 2. The ...
- 修改firefox默认下载路径
菜单栏---编辑---首选项--在常规页就可以看到下载设置了
- The 'brew link' step did not complete successfully
在mac 上更新node时遇到了一系列的问题: 卸载node重新安装之后提示: The 'brew link' step did not complete successfully 其实这里已经给出了 ...
- Things To Do Before NOI2017
TC div1 10套 数据结构 25题 网络流 10题 字符串 20题 数学 15题 图论 15题 计算几何 5题 提交答案 5题 嗯...先这些吧... 以上所有题目,博客都会有更新--- NOI ...