【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)个循环同构串,要求输出字典序最小的同构串的下标,字典 ...
随机推荐
- mysql数据库时间、字符串类型互转
时间格式转换: select DATE_FORMAT(NOW(),"%y-%m-%d %H:%i:%s") 字符串转时间: select STR_TO_DATE("201 ...
- css字体转换程序(Node.js)
我下载的是ttf文件,css导入的文件有多种格式:eot,woff,svg 在windows下,需要寻找相应的exe文件来处理或者node.js来处理: ttf2eot: https://github ...
- UWP入门一 7天酒店客户端源码及说明
以前写过一个wp8的工程,说实话那会的代码很麻烦,写起来费劲,另外还没多少人下载,不过到windows 10 开始微软出了UWP架构以后一切都像以前的winform wpf一样好转起来,新建一个工程以 ...
- Magento Block设计分析(深入分析)
Magento中Block是一个很重要的组件,它在Block中充当非常重要的角色,下面我们来分析一下Magento中Block是怎样设计的,我们应该怎样使用这个重要的角色. 1.Magento Blo ...
- JVM内存模型以及垃圾收集策略解析
http://xmuzyq.iteye.com/blog/599750 一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程. ...
- (一)JAVA使用POI操作excel
1,Poi 简介 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能 PO ...
- swift 泛型
T就是类型,范型
- asp.net:用类来后台绑定数据源
//封装成一个 using System;using System.Collections.Generic;using System.Linq;using System.Web;using Syste ...
- 基于注解整合struts2与spring的时候如果不引入struts2-spring-plugin包自动装配无效
基于注解整合struts2与spring的时候如果不引入struts2-spring-plugin包,自动装配将无效,需要spring注入的对象使用时将抛出空指针异常(NullPointerExcep ...
- 八卦某 G 的前端开发方式及流程
他山之石,可以攻玉. 话说本人从毕业到现在一直在某 B 公司工作,前些年折腾过不少开发方式和工具,但总觉得或许有更好的方案,所以很好奇其它公司内部是如何工作的,我曾经浏览过某 Y 公司内部无所不包 ...