<span>HDU 3374 exkmp+字符串最大最小表示法</span>

题意

找到一个字符串中最先出现的最小(大)表示位置,和最小(大)表示串出现次数

分析

用最小(大)表示法求出最先出现的最小(大)表示位置,然后将串长扩两倍用exkmp找出现次数。

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define pb push_back
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=2e6+10;
char s[maxn];
int n,nex[maxn];
int Get_min()
{
    int i = 0,j = 1,k = 0,t;
    while(i < n && j < n && k < n)
    {
        t = s[(i+k)%n] - s[(j+k)%n];
        if(!t) k++;
        else
        {
            if(t > 0) i += k+1;
            else j += k+1;
            if(i == j) j++;
            k = 0;
        }
    }
    return i >j ?j :i;
}
int Get_max()
{
    int i = 0,j = 1,k = 0,t;
    while(i < n && j < n && k < n)
    {
        t = s[(i+k)%n] - s[(j+k)%n];
        if(!t) k++;
        else
        {
            if(t > 0) j += k+1;
            else i += k+1;
            if(i == j) i++;
            k = 0;
        }
    }
    return i >j ?j :i;
}
int exkmp(int pos){
	int i=pos+1,j=0,p0=pos+1,cnt=1;
	while(i<2*n&&j<n&&s[i]==s[j+pos]) ++i,++j;
	nex[p0]=j;if(j==n) ++cnt;
	for(int i=pos+2;i<n;i++){
		j=max(0,min(nex[p0]+p0-i,nex[i-p0+pos]));
		if(i+j<nex[p0]+p0){
			nex[i]=j;
		}else{
			int k=i+j;
			while(k<2*n&&j<n&&s[k]==s[j+pos]) ++k,++j;
			nex[i]=j;p0=i;
		}
		if(nex[i]==n) ++cnt;
	}
	return cnt;
}
int main(){
	//ios::sync_with_stdio(false);
	//freopen("in","r",stdin);
	while(~scanf("%s",s)){
		n=strlen(s);
		for(int i=n;i<2*n;i++) s[i]=s[i-n];
		int j=Get_min();
		printf("%d %d ",j+1,exkmp(j));
		j=Get_max();
		printf("%d %d\n",j+1,exkmp(j));
	}
	return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 15:41
已编辑
淘天 算法工程师 31.0k*16.0
点赞 评论 收藏
分享
10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务