Revolving Digits

算法:

扩展KMP + KMP找循环节
Revolving DigitsRevolving DigitsView Code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include<map>
#include<set>
#include<algorithm>
#define MAXN 300010
using namespace std;
char S[MAXN], T[MAXN];
int next[MAXN];
int extend[MAXN];
int knext[MAXN];
int L, E, G, len;

void get_next( )
{
  int i = 0, j = 1, k = 1;
  len = strlen(T);
  next[0] = len;     
  while( T[i] == T[i + k] )
         i++;
  next[1] = i;
  for( int i = 2; i < len; i++)
  {
     if( i + next[i - k] < k + next[k] )
         next[i] = next[i - k];
     else
     {
        j = max(0, k + next[k] - i);
        while( T[j] == T[i + j] )
               j++;
        next[k = i] = j;        
     }     

  }

}

//用KMP判断是否有循环节 
void KMP( )
{
  int i = 0, j = -1;
  knext[0] = -1;
  while( i <= len )
  {
     if( j == -1 || T[i] == T[j] )       
     {
       ++i, ++j;
       knext[i] = j;    
     }
     else
        j = knext[j];    
  }
 // printf("len = %d knext[len] = %dn",len,knext[len]);
  if(  len - knext[len] != 0 && len - knext[len] != len && len % (len - knext[len]) == 0 )
  {  
      len = len - 1 - knext[len] + 1; //循环节长度 
  }
}

void solve( )
{ 
  int lenx = strlen(T);
  for( int i = 0; i < len; i++)
  {  
     if( next[i] >= lenx )
         E++;
     else if( S[next[i] + i] > S[next[i]] ) 
     {
         G++;     
     }     
     else
         L++;

  }     

}
int main( )
{
  int N, abc = 1;
  scanf("%d",&N);
  while( N-- )
  {
     scanf("%s",T);
     strcpy(S,T);
     strcat(S,T);      
     memset(next,0,sizeof(next));
     memset(knext,0,sizeof(knext));
     get_next( );
     L = E = G = 0;
     KMP( );
     solve( );
     printf("Case %d: %d %d %dn",abc++,L,E,G);
  }
  return 0;
}

原文链接: https://www.cnblogs.com/tangcong/archive/2012/08/08/2627835.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/58494

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午8:41
下一篇 2023年2月9日 上午8:41

相关推荐