HDU 5442 Favorite Donut 最大表示法+KMP

2024-06-15 11:18

本文主要是介绍HDU 5442 Favorite Donut 最大表示法+KMP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先2次最大表示法求出顺序和逆序情况下的位置,不过逆序求出来的是最大的下标,可以利用循环节来推出最小的位置。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000010;
int f[maxn];
char s[maxn];
void getFail(char p[])
{
int m = strlen(p);
f[0] = f[1] = 0;
for(int i = 1; i < m; i++)
{
int j = f[i];
while(j && p[i] != p[j])
j = f[j];
f[i+1] = p[i] == p[j] ? j+1 : 0;
}
}
int min_exp(char str[])
{
int i = 0, j = 1, len, k = 0;
len = strlen(str);
while(i < len && j < len && k < len)
{
int t = str[(i+k)%len] - str[(j+k)%len];
if(!t)
k++;
else
{
if(t > 0)
i = i + k + 1;
else
j = j + k + 1;
if(i == j)
j++;
k = 0;
}
}
return i > j ? j : i;
}
int max_exp(char str[])
{
int i = 0, j = 1, len, k = 0;
len = strlen(str);
while(i < len && j < len && k < len)
{
int t = str[(i+k)%len] - str[(j+k)%len];
if(!t)
k++;
else
{
if(t < 0)
i = i + k + 1;
else
j = j + k + 1;
if(i == j)
j++;
k = 0;
}
}
return i > j ? j : i;
}
char s1[22222], s2[22222];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int len;
scanf("%d %s", &len, s);
getFail(s);
int l = len-f[len];
int p1 = max_exp(s);
for(int i = p1, j = 0; j < len; j++, i = (i+1)%len)
{
s1[j] = s[i];
}
s1[len] = 0;
reverse(s, s+len);
int p2 = max_exp(s);
for(int i = p2, j = 0; j < len; j++, i = (i+1)%len)
{
s2[j] = s[i];
}
s2[len] = 0;
int ans = len%l == 0 ? l : len;
p2 = len-p2-1;
int dir = 0;
p1 %= ans;
p2 %= ans;
if(strcmp(s1, s2) < 0 || strcmp(s1, s2) == 0 && p1 > p2)
{
p1 = p2;
dir = 1;
}
printf("%d %d\n", p1+1, dir);
}
return 0;
}

这篇关于HDU 5442 Favorite Donut 最大表示法+KMP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063302

相关文章

《分析模式》“鸦脚”表示法起源,Everest、Barker和Hay

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》这本书里面用的并不是UML表示法。作者Martin Fowler在书中也说了,该书写于1994-1995年,当时还没有UML。作者在书中用的是一种常被人称为“鸦脚”的表示法。  有的同学会有误解,例如有同学发表以下感想: “鸦脚”表示法当然不是Fowler先使用的。F

关于修改计算机的处理器数和最大内存数的问题

问题描述: 刚开始本来是想让计算机的运行速度运行的快点,于是在网上搜索如何让计算机的运行速度更快,找到了一种关于修改计算机内存数和计算机的处理核数可以让计算机运行的更快。 遇到问题: 当我通过命令msconfig →引导→高级选项→勾选了处理器数和最大内存数,然后重启,结构整个计算机都卡的要死,于是记录下来。网上的答案有时候真的是很不负责任,也有可能是自己技术不到位。 结果:取消处理器和内

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i

LeetCode 算法:二叉树的最大深度 c++

原题链接🔗:二叉树的最大深度 难度:简单⭐️ 题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root = [1,null,2] 输出:2 提示: 树中节点的数量在 [0, 104] 区间内。-1

「LeetCode 084」最大面积

题目地址: https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。 example 第一种方法,我们先确定左右两个边界,然后找边界中的最小值。比方说,我们左边界确定

最大子数组问题(第4章:分治策略)

求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。   思路 1 当我们加上一个正数时,和会

HDU_1013

这个题目尤其需要注意的是开始输入的时候的数的大小,开始输入时有可能非常的大超过了长整型的范围,所以不能开始用整形来存放输入的,,就是开始的时候没有注意到这个问题所以开始的时候一直没有AC,后来就是用一个数组接收输入,然后在经过第一步转化之后就可以用一个整数来装了 #include <iostream>#include <stdlib.h>#include <string>usin

代码随想录算法训练营day62 | 42. 接雨水、84.柱状图中最大的矩形

42. 接雨水 暴力解法 遍历每根柱子(第一个和最后一个不需要遍历,因为不可能存住水),找到当前柱子的左边最高柱子lHeight,右边最高柱子rHeight,当前柱子能存的水为min(min(lHeight, rHeight) - 当前柱子的高度, 0) class Solution:def trap(self, height: List[int]) -> int:result = 0for

最长回文子串(百度笔试题和hdu 3068)

版权所有。所有权利保留。 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/17123559 求一个字符串的最长回文子串。注意子串是连续的,子序列是不连续的。对于最长回文子序列,要用动态规划解,具体请看: http://blog.csdn.net/xiaofei_it/article/details/1