新生赛3 1003 字符串最小表示法题目

Problem C

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 43   Accepted Submission(s) : 11

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

Recently, Tom did a research in 62-system number(0~9,A~Z,a~z mean 0~9, 10~35, 36~61 respectively). He wrote two 62-system numbers in two cards and asked bb and dd to choose one, dd always choose the first. Each of them can rotate the number to make the number minimum. ( after abc is rotated, the string changes like(abc->cab->bca->abc), certainly bb and dd will choose the smallest one )
The one that gets the smaller number wins. 

Input

The first line of the input is an integer T, which means there are exactly T cases in the input.
Each test case contain two strings(the first is the number dd chose , both are shorter than 10001)

Output

If dd wins output"dd", and if bb wins outputs "bb", otherwise outputs "ddbb".

Sample Input

1
0aab0
00aac

Sample Output

dd
直接贴代码了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char A1[10002],B1[10002];
int A[20002],B[20002];
int lena,lenb;
int input()
{
		int i;
		gets(A1);
		gets(B1);
		lena=strlen(A1);
		lenb=strlen(B1);
		for(i=0;i<lena;i++)
		if('0'<=A1[i]&&A1[i]<='9')
		A[i+lena]=A[i]=A1[i]-'0';
		else if('A'<=A1[i]&&A1[i]<='Z')
		A[i+lena]=A[i]=A1[i]-'A'+10;
		else if('a'<=A1[i]&&A1[i]<='z')
		A[i+lena]=A[i]=A1[i]-'a'+36;
		for(i=0;i<lenb;i++)
		if('0'<=B1[i]&&B1[i]<='9')
		B[i+lenb]=B[i]=B1[i]-'0';
		else if('A'<=B1[i]&&B1[i]<='Z')
		B[i+lenb]=B[i]=B1[i]-'A'+10;
		else if('a'<=B1[i]&&B1[i]<='z')
		B[i+lenb]=B[i]=B1[i]-'a'+36;
		return 0;
}
int MinimumRepresentation(int *s, int l)  
{  
	int i,j,k;
	i=0;j=1;k=0;
	while(i<l&&j<l)
	{
		k=0;
		while(s[i+k]==s[j+k]&&k<l) k++;
		if(k==l) return i;
		if(s[i+k]>s[j+k]) 
		 if(i+k+1>j) i=i+k+1;
		 else i=j+1;
		else if(j+k+1>i) j=j+k+1;
		else  j=i+1; 
	}
	if(i<l) return i;
	else return j;
} 
 
int compare(int s,int S)
{
	int i=s,I=S;
	do
		{
			if(A[i]>B[I]) return 1;
			else if(A[i]<B[I]) return -1;
			i++;
			I++;
		}
		while((i-s)!=(lena-1)&&(I-S)!=(lenb-1));
	if((i-s)==(lena-1)&&(I-S)==(lenb-1)) return 0;
	else if((i-s)==(lena-1)) return -1;
	else if((I-S)==(lenb-1)) return 1;
	 
}
int main()
{
	int T,k1,k2,k3;
	scanf("%d",&T);
	gets(A1);
	while(T--)
	{
		input();
		k1=MinimumRepresentation(A,lena);
		k2=MinimumRepresentation(B,lenb);
		k3=compare(k1,k2);
		if(k3==1) printf("bb
");
		else if(k3==0) printf("ddbb
");
		else if(k3==-1) printf("dd
");
	}
		return 0;
}



原文地址:https://www.cnblogs.com/zy691357966/p/5480471.html