1. 程式人生 > >ZOJ 1729 & ZOJ 2006(最小表示法模板題)

ZOJ 1729 & ZOJ 2006(最小表示法模板題)

輸出每個字串的最小字典序字串的下標!

#include <cstdio>  
#include <cstring>  
#include <iostream>  
#include <algorithm>  
using namespace std;  
const int maxn = 200017;  
char str[maxn], tmp[maxn];  
//最小表示法  
int len;  
int get_minstring(char *s)  
{  
    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(t > 0)  
                i+=k+1;  
            else  
                j+=k+1;  
            if(i==j) j++;  
            k=0;  
        }  
    }  
    return min(i,j);  
}  
int main()  
{  
    int t;  
    int len;  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%d",&len);  
        scanf("%s",str);  
        int ans = get_minstring(str);  
        printf("%d\n",ans+1);  
    }  
    return 0;  
}