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