码迷,mamicode.com
首页 > 其他好文 > 详细

hdu3374 最大最小表示法 +kmp

时间:2015-09-15 17:57:07      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn=2000005;
int MinRepresstation(char * S, int len ) {
      int i = 0, j = 1, k = 0;
      while(i < len && j < len)
        {
            k = 0;
           while(k < len && S[(i + k)%len] == S[(j + k)%len])
            k++;
           if(k >= len)
            break;
           if(S[(i + k)%len] > S[(j + k)%len])
            i = max(i + k + 1, j + 1);
           else
            j = max(i + 1, j + k + 1);
        }
      return min(i ,j);
}
int MaxRepresstation(char * S, int len ) {
      int i = 0, j = 1, k = 0;
      while(i < len && j < len)
        {
            k = 0;
           while(k < len && S[(i + k)%len] == S[(j + k)%len])
            k++;
           if(k >= len)
            break;
           if(S[(i + k)%len] > S[(j + k)%len])
            j = max(i + 1, j + k + 1);
           else
            i = max(i + k + 1, j + 1);
        }
      return min(i ,j);
}
char s[maxn];
char s1[maxn],s2[maxn];
void getFail(char *P, int *f, int m)
{
    f[0]=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 find(char *T,char *P, int *f,int n, int m)
{
    getFail(P,f,m);
    int j=0;
    int num=0;
    for(int i=0; i<n-1; i++)
    {
         while(j&&P[j]!=T[i])j=f[j];
         if(P[j]==T[i])j++;
         if(j==m){
            num++; j=f[j];
         }
    }
    return num;
}
int F[maxn];

int main()
{

    while(gets(s))
        {

          int len=strlen(s);
          int d1=MinRepresstation(s,len);
          int d2=MaxRepresstation(s,len);
          for(int i = 0 ; i < len ; i ++)
            s[ i + len ] = s[ i ];
          for(int i=0; i<len; i++)
            {
                s1[i]=s[(i+d1)%len];
                s2[i]=s[(i+d2)%len];
            }
          int ans1=find(s,s1,F,len*2,len);
          int ans2=find(s,s2,F,len*2,len);
          printf("%d %d %d %d\n",d1+1,ans1,d2+1,ans2);
        }

    return 0;
}

 

hdu3374 最大最小表示法 +kmp

标签:

原文地址:http://www.cnblogs.com/Opaser/p/4810570.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!