POJ 1509 Glass Beads

这道题是求字符串最小表示的第一个字符在字符串中的位置。做之前看了IOI2003冬令营周源大神的

论文《浅析“最小表示法”思想在字符串循环同构问题中的应用》。这里虽然每个样例只有一个字符

串,但是我们可以构造出一个字符串s + 1,和s来找同构,然后取找到的位置ij之中小的那个。

 

/*Accepted    100K    16MS    C++    700B    2012-08-03 09:39:45*/

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<algorithm>

using namespace std;

const int MAXN = 10010;

char s[MAXN];



int Minpre()

{

    int i = 0, j = 1, k = 0, len = strlen(s), x, y;

    while(k < len && j < len && i < len)

    {

        x = (i + k) % len;

        y = (j + k) % len;

        if(s[x] < s[y])

            j = j + k + 1, k = 0;

        else if(s[x] > s[y])

            i = i + k + 1, k = 0;

        else

            ++ k;

        if(i == j) ++ j;

    }

    return min(i, j);

}



int main()

{

    int T;

    scanf("%d", &T);

    while(T --)

    {

        scanf("%s", s);

        printf("%d\n", Minpre() + 1);

    }

    return 0;

}

 

 

 

你可能感兴趣的:(poj)