HDU 3374 最小/大表示法+KMP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374
题意:给定一个串s,该串有strlen(s)个循环同构串,要求输出字典序最小的同构串的下标,字典序最小的出现次数,最大的同构串的下标,字典中最大的出现次数。
思路:对于求循环同构的字典序最小可以用最小表示法求得,最大也是一样。然后设ds为字符串s+s。然后就可以用KMP求最小串在ds出现的次数和最大串出现的次数了。
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
const int MAXN = + ;
typedef long long int LL;
#define INF 0x3f3f3f3f
int Representation(char *s,int l,bool flag){ //flag:0 最小表示法 flag:1 最大表示法
int i = , j = , k = ;
while (i < l&&j < l&&k < l){
int li, lj;
li = (i + k) >= l ? i + k - l : i + k;
lj = (j + k) >= l ? j + k - l : j + k;
if (s[li] == s[lj]){
k++;
}
else{
if (!flag){
if (s[li]>s[lj]){
i = i + k + ;
}
else{
j = j + k + ;
}
}
else{
if (s[li]<s[lj]){
i = i + k + ;
}
else{
j = j + k + ;
}
}
if (i == j){
j++;
}
k = ;
}
}
return i < j ? i : j;
}
int Next[MAXN];
void getnext(char *s,int lens){ //KMP的next数组
int j, k;
j = ; k = -; Next[] = -;
while (j < lens){
if (k == - || s[j] == s[k]){
Next[++j] = ++k;
}
else{
k = Next[k];
}
}
}
int KMP_Count(char *s,int lens,char *t,int lent){ //计算t串在s串中出现的次数
int ans = , j = ;
memset(Next, , sizeof(Next));
getnext(t,lent);
for (int i = ; i < lens; i++){
while (j> && s[i] != t[j]){
j = Next[j];
}
if (s[i] == t[j]){
j++;
}
if (j == lent){
ans++;
j = Next[j];
}
}
return ans;
}
char str[MAXN], dstr[MAXN*],minstr[MAXN],maxstr[MAXN];
//原串,原串*2后的串,字典序最小的串,字典序最大的串
int main()
{
while (~scanf("%s", str)){
int len = strlen(str);
for (int i = ; i < len * ; i++){
dstr[i] = str[(i%len)];
}
//计算最小
int minstart = Representation(str, len,);
for (int i = ; i < len; i++){
minstr[i] = str[(i + minstart) % len];
}
int mincount = KMP_Count(dstr, len * - , minstr, len);
//计算最大
int maxstart = Representation(str, len,);
for (int i = ; i < len; i++){
maxstr[i] = str[(i + maxstart) % len];
}
int maxcount = KMP_Count(dstr, len * - , maxstr, len);
printf("%d %d %d %d\n", minstart + ,mincount , maxstart + , maxcount);
}
return ;
}
HDU 3374 最小/大表示法+KMP的更多相关文章
- 【HDU3374】 String Problem (最小最大表示法+KMP)
String Problem Description Give you a string with length N, you can generate N strings by left shift ...
- 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 ...
- String Problem hdu 3374 最小表示法加KMP的next数组
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 3374 exkmp+字符串最大最小表示法
题意 找到一个字符串中最先出现的最小(大)表示位置,和最小(大)表示串出现次数 分析 用最小(大)表示法求出最先出现的最小(大)表示位置,然后将串长扩两倍用exkmp找出现次数. Code #incl ...
- HDU - 3374 String Problem (kmp求循环节+最大最小表示法)
做一个高产的菜鸡 传送门:HDU - 3374 题意:多组输入,给你一个字符串,求它最小和最大表示法出现的位置和次数. 题解:刚刚学会最大最小表示法,amazing.. 次数就是最小循环节循环的次数. ...
- HDU 3374 String Problem (KMP+最大最小表示)
HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others) Memory ...
- Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)
题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...
- 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+最小最大表示)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3374 [题目大意] 给出一个字符串,求出最小和最大表示是从哪一位开始的,并且输出数量. [题解] ...
随机推荐
- UVA 10815 Andy's First Dictionary ---set
题目链接 题意:输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出.单词不区分大小写. 刘汝佳算法竞赛入门经典(第二版)P112 #include <iostream> ...
- iOS- 如何改变section header
希望这个从UITableViewDelegate协议里得到的方法可以对你有所帮助: - (UIView *) tableView:(UITableView *)tableView viewForHea ...
- Android笔记:获取屏幕信息
像素密度(dpi) float xdpi = getResources().getDisplayMetrics().xdpi;float ydpi = getResources().getDispla ...
- September 4th 2016 Week 37th Sunday
The morning crowned the humble cloud with splendor. 晨光为谦逊的白云披上壮丽的光彩. Humility is a virtue. Many famo ...
- express响应前端ajax请求
后端其实并不需要知道前端发起的请求是不是ajax,后端只需要响应请求即可.例子: 前端这样写: $('button').on('click', function(event) { event.prev ...
- JUnit笔记
- 傻瓜式十分钟免费开启 HTTPS,是时候为你的站点加上小绿锁了
http://gold.xitu.io/entry/57df65690bd1d00057f9455b?from=singlemessage&isappinstalled=0 原文链接:http ...
- 使用python递归子目录处理日志文件
重要说明: (1)python使用4个空格进行层次缩进的(不是tab),在eclipse里面可以直接使用tab缩进,是因为eclipse会实时地将tab转成4个空格 (2)在eclipse中安装pyD ...
- BZOJ1004 [HNOI2008]Cards(Polya计数)
枚举每个置换,求在每个置换下着色不变的方法数,先求出每个循环的大小,再动态规划求得使用给定的颜色时对应的方法数. dp[i][j][k]表示处理到当前圈时R,B,G使用量为i,j,k时的方法数,背包思 ...
- Juery Ajax语法
$.ajax({ url: "/ForgetCard/ForgetLogin",//方法路径URL data: { strUser: $("#textUser" ...