最小表示法

 题目链接:https://cn.vjudge.net/problem/POJ-1509

最小表示法:判断头尾详解的字符串最小的字典序是从第几个字符串开始的。

具体思路:线性的,我们设立两个下表,然后设立一个变量len。

首先令i=0,j=1,len=0;

一开始,我们比较s[i+len]和s[j+len],如果相等的话,就让len++。

如果s[i+len]>s[j+len],我们可以直接让i移到i+len+1,因为在i->i+len这段区间里,都不会使得获得的字符串最小。

如果s[i+len]<s[j+len],我们可以让j移动到j+len+1,这样的话,在j->j+len这段区间里,也都不会使得获得的字符串字典序最小。

https://blog.csdn.net/qq_37369394/article/details/78418391

AC代码:

#include <bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn  =2e5+10;
char str[maxn];
int get_min()
{
    int len=strlen(str);
    int i=0,j=1,k=0;
    while(i<len&&j<len&&k<len)
    {
        int t=str[(i+k)%len]-str[(j+k)%len];
      //  cout<<t<<endl;
        if(t==0)
            k++;
        else
        {
            if(t>0)
            {
                i+=k+1;
            }
            else
            {
                j+=k+1;
            }
            if(i==j)j++;
            k=0;
        }
    }
    return min(i,j);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",str);
        int ans=get_min()+1;
        printf("%d\n",ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值