百度之星资格赛——H题

H:用户请求中的品牌
时间限制: 1000ms 内存限制: 65536kB
描述
馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇。在比方说“johnsonjohnson”、“duckduck”,这些词汇虽然看起来是一些词汇的单纯重复,但是往往都是一些特殊品牌的词汇,不能被拆分开。为了侦测出这种词的存在,你今天需要完成我给出的这个任务——“找出用户请求中循环节最多的子串”。
输入
输入数据包括多组,每组为一个全部由小写字母组成的不含空格的用户请求(字符串),占一行。用户请求的长度不大于100,000。
最后一行输入为#,作为结束的标志。
输出
对于每组输入,先输出这个组的编号(第n组就是输出“Case n:”);然后输出这组用户请求中循环节最多的子串。如果一个用户请求中有两个循环节数相同的子串,请选择那个字典序最小的。
样例输入
ilovejohnsonjohnsonverymuch
duckduckgo
aaabbbcccisagoodcompany
#
样例输出
Case 1: johnsonjohnson
Case 2: duckduck

Case 3: aaa

==============================================================================================================================

(鉴于本人笨拙,以下代码只完成了部分功能,暂时未完成字典序最小的排序,并未提交OJ)

#include<stdio.h>
#include<malloc.h>
#include<string.h>

typedef int bool;
#define true 1
#define false 0


bool cmpstr(char s1[],char s2[],int i,int j)
{
	bool res=true;
	int k;
	for(k=i;k<=j;k++)
	{
		if(s1[k]==s2[k+1])
		{
			res=res&true;
		}
		else
			res=res&false;
	}
	return res;
}

bool cmpdstr(char s1[],char s2[],int i1,int i2,int j1,int j2)
{
        bool res=true;
	if(i2-i1!=j2-j1)
	{
		res=false;
		return res;
	}
        int k,n=i2-i1;
        for(k=i1;k<i1+n;k++)
        {
                if(s1[k]==s2[k+j1-i1])
                {
                        res=res&true;
                }
                else
                        res=res&false;
        }
        return res;
}



void dispstr(char s[],int i,int j)
{
//	printf("repeat--");
//	int k;
//	for(k=i;k<=j;k++)
	//	printf("%c",s[k]);
//	printf("\n");
}

void dispstr1(char s[],int i,int j)
{
        int k;
        for(k=i;k<=j;k++)
                printf("%c",s[k]);
}


char* getstr(char s[],int i,int j)
{
	char* c=(char*)malloc((j-i+2)*sizeof(char));
	memset(c,0,j-i+1);
	int k;
        for(k=i;k<=j;k++)
                *(c+k-i)=s[k];
	return c;
}

int maxcount(int s[],int n)
{
	int max=0,i,index=0;
	for(i=0;i<n;i++)
	{
		if(s[i]>max)
		{
			max=s[i];
			index=i;
		}
	}
	return index;
}

char* get_repeat_str(char* s)
{
	int i,len,inc,n,j,tempj;
	char* tempstr;
	len=strlen(s);
	//printf("len:%d\n",len);
	inc=len/2-1;
	bool res;
	int pi[100],pj[100];int pij=0;
	while(inc>=0)
	{		
		//	printf("inc:%d\n",inc);
		n=len-inc; //n is the length when gothrough the string
		char L[n+1],R[n+1];// two array to store the left and right elements
		L[n]='\0';R[n]='\0';
		for(i=0;i<n;i++)
		{
			L[i]=s[i];
			R[i]=s[i+inc];
		}
		//	puts(L);puts(R);
		
		for(i=0;i<n-1;i++)
		{
			for(j=i+1;j<n;j++)
			{				
				if(L[i]==L[j]&&R[i]==R[j])
				{
					//printf("L:%c R:%c\n",L[i],R[i]);
					if(i+inc+1==j)
					{
						res=cmpstr(L,R,i,j-1);
						//printf("res:%d\n",res);
						if(res)
						{
							dispstr(L,i,j-1);//printf("\nok\n");
	//						printf("i=%d j=%d\n",i,j);
	//						printf("s1:%s s2:%s\n",getstr(s,i,i+inc),getstr(s,j,j+inc));
							//return;
							pi[pij]=i;pj[pij]=j;pij++;
						}
						
					}
						
				}
			}
		}
		inc--;
	}
//	for(i=0;i<pij;i++)
//	{printf("%d ",pi[i]);}
	int count[100]={1};
	for(i=0;i<pij-1;i++)
	{
		count[i]=1;
		for(j=i+1;j<pij;j++)
		{
			if(pj[i]==pi[j]&&cmpdstr(s,s,pi[i],pi[j],pi[j],pj[i]))
			{
				count[i]++;					
			}
		}
		
	}
	int maxcountindex=maxcount(count,pij);
	for(i=0;i<count[maxcountindex]+1;i++)
	{
		dispstr1(s,pi[maxcountindex],pj[maxcountindex]-1);
	}
	printf("\n");
	return s;
}


int main()
{
	char c;
	char* s=(char*)malloc(100001*sizeof(char));
	memset(s,0,100000);
	do
	{
		gets(s);
		if(s[0]!='#')
		{
			get_repeat_str(s);
		}
	}while(s[0]!='#');
	return 0;
}



你可能感兴趣的:(c,工作,百度,query,ini,任务)