USACO5.5.2最小表示法

USACO5.5.2最小表示法

后缀数组不会,也不知道他们怎么暴力做掉的。
于是拜读了一篇论文,学习了最小表示法。
让后AC了。
...
/**//*
USER:zyn19961
TASK:hidden
LANG:C++
*/

#include
<string>
#include
<cstdio>
#include
<cstring>
#include
<fstream>
#include
<iostream>
#include
<algorithm> 
using namespace std;
//
#define MM(a,i) memset(a,i,sizeof(a))
#define FOR(i,l,r) for (int i=(l);i<=(r);i++)
#define NFOR(i,l,r) for (i=(l);i<=(r);i++)
#define DFOR(i,r,l) for (int i=(r);i>=(l);i--)
//
#define MP make_pair
#define FT first
#define SD second
//
    typedef long long Int64;
    
const int INF=~0U>>2;
    
const int maxn=200007;
//
    ifstream fin("hidden.in");
    ofstream fout(
"hidden.out");
//
    string S(maxn,0),s(maxn,0);
    
int main(){
        
int n;fin>>n;
        S.clear();
        FOR(i,
1,(n-1)/72+1)fin>>s,S+=s;S+=S;
        
int i=0,j=1,k;
        
for(;j<n;){
            NFOR(k,
0,n-1)if(S[i+k]!=S[j+k])break;
            
if(k==n)break;
            
if(S[i+k]>S[j+k])i+=k+1;
            
else j+=k+1;
            
if(j==i)j++;
            }

        fout
<<i<<"\n";
        fin.close();
        fout.close();
        
return 0
        }


你可能感兴趣的:(USACO5.5.2最小表示法)