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; }