【KMP】 HDU 3374 String Problem 最小表示法

来源:互联网 发布:131458com淘宝账号查询 编辑:程序博客网 时间:2024/05/16 05:43

链接
求最小/大 字典序的串在的rank和出现次数

最小表示法:起始位置i,j 增加k的过程中比较大小
不相等时改变起始位置i/j=i/j+k+1,k=0 ;
意味着后缀都小于当前最小串

//#include<bits/stdc++.h>//using namespace std;//const int eps=1e-8;//const int maxn=100022;//#define LL __int64//int main()//{//    return 0;//}#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#include <queue>#include <string>#include <cstring>#include <sstream>#include <map>#include <vector>#define LL long longconst int maxn=2001000;int next1[maxn];int get_next(char *s,int len){    int i=0,j=-1;    next1[0]=j;    while(i<len)    {        if(j==-1||s[i]==s[j])            i++,j++,next1[i]=j;        else j=next1[j];    }}int KMP(char *a,int alen,char *b,int blen){    int i=0,j=0;    int num=0;    while(i<alen-1&&j<blen)    {        if(j==-1||a[i]==b[j])            i++,j++;        else j=next1[j];        if(j==blen)        {            j=next1[j];num++;        }    }    return num;}int get_mstring(char *s,int flag){    int len=strlen(s);    int i=0,j=1,k=0;    while(i<len&&j<len&&k<len)    {        int t=s[(i+k)%len]-s[(j+k)%len];        if(t==0)            k++;        else        {            if(flag)            {                if(t>0) j+=k+1;                else i+=k+1;            }            else            {                if(t>0) i+=k+1;                else j+=k+1;            }            if(i==j) j++;            k=0;        }    }    return min(i,j);}char s[1000002];int main(){    int n;    while(scanf("%s",s)!=EOF)    {        int ln=get_mstring(s,0);        int rn=get_mstring(s,1);        int len=strlen(s);        get_next(s,len);        int x=(len-next1[len]);        int ans=len%x?1:len/x;        printf("%d %d %d %d\n",ln+1,ans,rn+1,ans);    }    return 0;}
0 0