【HDU3374】 String Problem (最小最大表示法+KMP)
String ProblemDescription
Give you a string with length N, you can generate N strings by left shifts. For example let consider the string “SKYLONG”, we can generate seven strings:
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.Input
Each line contains one line the string S with length N (N <= 1000000) formed by lower case letters.Output
Output four integers separated by one space, lexicographically fisrt string’s Rank (if there are multiple answers, choose the smallest one), the string’s times in the N generated strings, lexicographically last string’s Rank (if there are multiple answers, choose the smallest one), and its times also.Sample Input
abcder
aaaaaa
abababSample Output
1 1 6 1
1 6 1 6
1 3 2 3
用最大最小表示法,KMP求个数。
注意特殊的时候在KMP中加入长度特判。
最小最大表示法是求出循环子串得到最小最大表示。
表示我之前并没有遇到过,貌似还有些神奇的应用?不知道、、
但是打起来还是挺简单的,也很容易证明。
int get_st(bool p)
{
int i=1,j=2,k=0;
while(i<=l&&j<=l&&k<=l)
{
if(s[i+k]==s[j+k]) k++;
else if((s[i+k]>s[j+k])==(!p))
{
i+=k+1;
k=0;
}
else
{
j+=k+1;
k=0;
}
if(i==j) j++;
}
return mymin(i,j);
}
这个我把最小表示和最大表示合在一起了。p=0是最小,p=1时最大。
证明的话...连续匹配过程中一旦发现字符有小于其他字符的,那么他一定不是最大表示,且他前面连续的一段也不是。
本题代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 1000010 char s[*Maxn];
int nt[Maxn*],l; int mymin(int x,int y) {return x<y?x:y;} int get_st(bool p)
{
int i=,j=,k=;
while(i<=l&&j<=l&&k<=l)
{
if(s[i+k]==s[j+k]) k++;
else if((s[i+k]>s[j+k])==(!p))
{
i+=k+;
k=;
}
else
{
j+=k+;
k=;
}
if(i==j) j++;
}
return mymin(i,j);
} void get_nt(int x)
{
nt[x]=x-;int p=x-;
for(int i=x+;i<=x+l-;i++)
{
while(s[i]!=s[p+]&&p>=x) p=nt[p];
if(s[i]==s[p+]) p++;
nt[i]=p;
}
} int ffind(int x)
{
int ans=;int p=x-;
for(int i=;i<=*l;i++)
{
while((s[i]!=s[p+]&&p>=x)||p-x+>=l) p=nt[p];
if(s[i]==s[p+]&&p-x+<l) p++;
if(i>l&&p-x+>=l) ans++;
}
return ans;
} int main()
{
while(scanf("%s",s+)!=EOF)
{
l=strlen(s+);
for(int i=;i<=l;i++) s[i+l]=s[i];
int st=get_st();
get_nt(st);
printf("%d %d ",st,ffind(st)); st=get_st();
get_nt(st);
printf("%d %d\n",st,ffind(st));
}
return ;
}
HDU3374
2016-08-17 15:59:59
【HDU3374】 String Problem (最小最大表示法+KMP)的更多相关文章
- HDU3374 String Problem —— 最小最大表示法 + 循环节
题目链接:https://vjudge.net/problem/HDU-3374 String Problem Time Limit: 2000/1000 MS (Java/Others) Me ...
- 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 ...
- hdu3374 String Problem 最小最大表示法 最小循环节出现次数
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int ...
- hdu String Problem(最小表示法入门题)
hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...
- hdu3374 String Problem【最小表示法】【exKMP】
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu3374 String Problem
地址:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目: String Problem Time Limit: 2000/1000 MS (Java/ ...
- hdu3374 String Problem KMP+最大最小表示法
Give you a string with length N, you can generate N strings by left shifts. For example let consider ...
- 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 最小/大表示法+KMP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题意:给定一个串s,该串有strlen(s)个循环同构串,要求输出字典序最小的同构串的下标,字典 ...
随机推荐
- c语言,strcpy
#include <stdio.h> #include <string.h> int main() { char string[10]; char *str="a ...
- 基于Windows的套接字相关函数及示例
链接ws2_32.lib库 头文件#include <winsock2.h> int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSADa ...
- UNIX线程之间的关系
我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1. 主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include & ...
- 在List中找出最大值的两种方法
先说需求:找出一个对象List中,某个属性值最大的对象. 1.定义对象 private class A { public int ID { get; set; } public string Name ...
- Linux云主机安装JDK,配置hadoop的详细方式
云主机我使用的是青云的,还有好多其他品牌,比如阿里云 unitedstack 等等. 注册完青云后,会有试用券发到账户,可以利用此券试用其服务. 1 首先创建好一个主机,按照提示选择好系统,创建好一个 ...
- ACM——3n+1
3n+1 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:937 测试通过:386 描述 对于任意大于1的自然 ...
- 如何重写EF DBContext 获取链接字符串的方法
public partial class byvarDBFirst: DbContext { //使用自定义连接串 private static string GetEFConnctionString ...
- iOS开发——音频篇——音效的播放
一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的“背景音乐”,一般播放时间较 ...
- iOS 获取设备型号以及IP地址
首先导入四个头文件 #include <sys/types.h> #include <sys/sysctl.h> #include <ifaddrs.h> #inc ...
- C#下如何用NPlot绘制期货股票K线图(3):设计要显示的股票价格图表窗口并定义相应类的成员及函数
[内容简介] 上一篇介绍了要显示K线图所需要的数据结构,及要动态显示K线图,需要动态读取数据文件必需的几个功能函数.本篇介绍要显示蜡烛图所用到的窗口界面设计及对应类定义.下面分述如下: [窗口界面] ...