• hdu3374 最大最小表示法 +kmp


    #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
    ",d1+1,ans1,d2+1,ans2);
            }
    
        return 0;
    }
  • 相关阅读:
    GitHub 更新fork的代码
    robotframework出现错误:Keyword 'AppiumLibrary.Open Application' expected 1 to 2 non-keyword arguments,got 5.
    adb命令积累
    appium测试android环境搭建(win7)
    小明的自留地
    转载:appium踩过的坑
    junit3和junit4的使用区别如下
    Python线程指南
    实现ie低版本支持input type="number"
    LODOP打印开发
  • 原文地址:https://www.cnblogs.com/Opaser/p/4810570.html
Copyright © 2020-2023  润新知