HDU 3374 String Problem (KMP+最大最小表示)
HDU 3374 String Problem (KMP+最大最小表示)
String Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1602 Accepted Submission(s): 714
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.
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
char str[1000005];
char str1[1000005];
int len;
int main(void)
{
int i;
int a1,a2;
while(scanf("%s",str)==1)
{
strcpy(str1,str);
len=strlen(str);
sort(str,str+len);
int k1=0,k2=0;
for(i=0;str[i]!='\0';i++)
{
if(str[i]==str[0])
k1++;
if(str[i]==str[len-1])
k2++;
}
for(i=0;str1[i]!='\0';i++)
{
if(str1[i]==str[0])
{
a1=i;
break;
}
}
for(i=0;str1[i]!='\0';i++)
{
if(str1[i]==str[len-1])
{
a2=i;
break;
}
}
printf("%d %d %d %d\n",a1+1,k1,a2+1,k2);
}
return 0;
}
不知道哪里错了,如果谁知道,请留言!
后来到网上搜了一下发现别人是用next数组,根据l=len-next[len]为最小字符串找个数,根据最小表示法,与最大表示法,找初始位置。
//最小表示法
int minexp(char *s,int x)//x=strlen(s);
{
int i=0,j=1,k=0,t;
while(i<x&&j<x&&k<x)
{
t=s[(i+k)%x]-s[(j+k)%x];
if(t==0) k++;
else
{
if(t>0)
i+=k+1;
else
j+=k+1;
if(i==j)
j++;
k=0;
}
}
return i<j?i:j;
}
int maxexp(char *s,int x)
{
int i=0,j=1,k=0,t;
while(i<x&&j<x&&k<x)
{
t=s[(i+k)%x]-s[(j+k)%x];
if(t==0) k++;
else
{
if(t<0) i+=k+1; //这里是最小表示法与最大表示法的区别。
else j+=k+1;
if(i==j) j++;
k=0;
}
}
return i<j?i:j;
}
AC代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char pat[1000005];
int lenp,next[1000005];
void get_next()
{
int i,j;
next[0]=-1;
i=0;
j=-1;
while(i<lenp)
{
if(j==-1||pat[i]==pat[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
//最小表示
int minexp(char *s,int x)
{
int i=0,j=1,k=0,t;
while(i<x&&j<x&&k<x)
{
t=s[(i+k)%x]-s[(j+k)%x];
if(t==0) k++;
else
{
if(t>0)
i+=k+1;
else
j+=k+1;
if(i==j)
j++;
k=0;
}
}
return i<j?i:j;
}
//最大表示
int maxexp(char *s,int x)
{
int i=0,j=1,k=0,t;
while(i<x&&j<x&&k<x)
{
t=s[(i+k)%x]-s[(j+k)%x];
if(t==0) k++;
else
{
if(t<0) i+=k+1; //这里是区别
else j+=k+1;
if(i==j) j++;
k=0;
}
}
return i<j?i:j;
}
int main()
{
int ans,i,j,a,b;
while(scanf("%s",pat)!=EOF)
{
lenp=strlen(pat);
get_next();
a=minexp(pat,lenp);
b=maxexp(pat,lenp);
int l=lenp-next[lenp];
if(lenp%l==0)
{
ans=lenp/l;//cout<<lenp/l<<endl;;
}
else
{
ans=1;//printf("1\n");
}
printf("%d %d %d %d\n",a+1,ans,b+1,ans);
}
return 0;
}
HDU 3374 String Problem (KMP+最大最小表示)的更多相关文章
- HDU 3374 String Problem(KMP+最大(最小)表示)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:给出一个字符串,依次左移一个单位形成一堆字符串,求其字典序最小和最大的字符串需要左移多 ...
- HDU 3374 String Problem (KMP+最大最小表示)
KMP,在有循环节的前提下: 循环节 t = len-next[len], 个数num = len/(len-next[len]);个人理解,如果有循环节,循环节长度必定小于等于len/2, 换句话说 ...
- hdu 3374 String Problem(kmp+最小表示法)
Problem Description Give you a string with length N, you can generate N strings by left shifts. For ...
- HDU 3374 String Problem(最大最小表示+KMP)题解
题意:给你一个字符串,这个字符串可以这样操作:把第一个字符放到最后一个形成一个新的字符串,记原式Rank为1,每操作一步Rank+1,问你这样操作得出的最小字典序的字符串的Rank和这样的字符串有几个 ...
- 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 题意:多组输入,给你一个字符串,求它最小和最大表示法出现的位置和次数. 题解:刚刚学会最大最小表示法,amazing.. 次数就是最小循环节循环的次数. ...
- 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 题目大意:输出最大和最小的是从哪一位开始的,同时输出最小循环节的个数. 这里简单介绍对字符串最小 ...
随机推荐
- CentOS 6.5配置mysql
启动mysql service mysqld start 给root账号设置密码 mysqladmin -u root password '
- usb免驱动摄像头实验
1.编译openwrt系统内核使它支持usb,进入在/openwrt/trunk上执行make menuconfig 2.1). 添加USB 相关支持Kernel modules —> USB ...
- thinkphp5.0入口文件
入口文件 ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个应用都有一个统一(但不一定是唯一)的入口. 应该说,所有应用都是从入口文件开始的,并且不同应用的入口文件是类似的. ...
- Android---Parcelable包装类的作用
android提供了一种新的类型:Parcel.本类被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递. 除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel ...
- 有两个数据库A和B,数据库A中有表a,如何把表a映射到数据库B中,sql 2005
select * into B.dbo.a from A.dbo.a 就把表同步过去如果只同步表结构select * into B.dbo.a from A.dbo.a where 1<> ...
- PAT (Advanced Level) 1006. Sign In and Sign Out (25)
简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> ...
- ffmpeg ffplay ffprobe资料整理
1. 官网地址:https://ffmpeg.org/ 官网文档地址:https://ffmpeg.org/documentation.html 官网下载地址:https://ffmpeg.org/d ...
- CDOJ 1273 God Qing's circuital law
暴力枚举+idea.做的时候mod写错了,写成了1000000009,找了两个多小时才发现...... a[1],a[2],a[3]....a[N] b[1],b[2],b[3]....b[N] 首先 ...
- android 6.0获取权限
Android版本升到6.0后最坑的就是权限问题,以下是我参考大神一个权限管理工具类,希望对大家有用 PermissionUtils.java import android.Manifest; imp ...
- CodeForces 652C Foe Pairs
只要计算每个位置最多能到哪个位置,累加即可,DP从后往前预处理一下每个位置到达的最远位置. 有坑点:输入的时候如果同一个点出发的,需要保存最小值. #include<cstdio> #in ...