IT民工
加油!

这道题是求字符串最小表示的第一个字符在字符串中的位置。做之前看了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;
}

 

 

 

posted on 2012-08-03 09:45  找回失去的  阅读(257)  评论(0编辑  收藏  举报