ZOJ_1729

    实际上就是要求去求给定字符串的“最小表示”。

#include<stdio.h>
#include<string.h>
#define MAXD 200010
int N;
char b[MAXD];
void solve()
{
int i, j, k, p1, p2;
scanf("%d%s", &N, b);
for(i = N; i < 2 * N; i ++)
b[i] = b[i - N];
p1 = 0, p2 = 1;
for(;;)
{
for(k = 0; k < N; k ++)
if(b[p1 + k] != b[p2 + k])
break;
if(k == N)
break;
if(b[p1 + k] < b[p2 + k])
p2 = p2 + k + 1;
else
p1 = p1 + k + 1;
if(p1 == p2)
++ p2;
if(p1 >= N || p2 >= N)
break;
}
printf("%d\n", p1 < p2 ? p1 : p2);
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
solve();
}
return 0;
}


posted on 2012-01-30 00:53  Staginner  阅读(250)  评论(0编辑  收藏  举报