【字符串】关于循环字符串字典序最大最小位置表示法

本篇博客探讨hdu3374问题,内容涉及如何找到一个循环字符串字典序最小和最大的字符串及其左移次数。通过最小最大表示法,分析算法思路,其中关键在于以最小串为基础,比较两个串的相对顺序,动态更新可能的最小串位置,最终确定最小和最大串的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hdu3374
题意:给出一个字符串,依次左移一个单位形成一堆字符串,求其字典序最小和最大的字符串需要左移多少位,以及一共有几个这样的字符串。

题目分析:首先可以确定两个字符串出现的次数应该相同。由于假设最小的左移m位得到最大的话,那么所有相同的最小字符串左移m位都会得到最大串。对于求解最小最大串的位置可以用最小最大表示法。

最大最小表示法:总的来说就是这道题的模板,求一个循环串字典序的最小和最大的位置。算法整体思想很简单,以最小为例如题,指针i,j分别代表比较的两个串的串首位置,这两个位置是互相更新的。当s[i+k]==s[j+k]时,k++,当s[i+k]<s[j+k]时,说明j串比i串大了,同时j+m串也一定比i+m串大(m=1,2,3。。。。k)所以j到j+k之内是不会有最小串了。把j直接更新到j+k+1。大小顺序反过来的时候同理。最大表示法也同理。最后取i与j中小的一个就是其位置。另外注意一点就是当更新位置后i和j重叠的时候为方便编码同意j++。具体看代码。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define eps 0.000000001
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
const int maxn=1e6+5;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值