|  | 
				
					
	
		
			
 			Posted on 2009-10-13 22:46 Uriel  阅读(871) 评论(0)  编辑 收藏 引用   所属分类: POJ  、字符串处理         后缀数组还是没懂。。Regional 之前应该是来不及了。。       这题可以练后缀数组的。。KMP 水过去了。。后来发现strstr也行。。跟KMP一样16Ms。。。 
 strstr版本:
 
   /**//*Problem: 3080  User: Uriel 
  Memory: 584K  Time: 16MS 
  Language: G++  Result: Accepted*/ 
  
  #include<stdio.h> 
  #include<stdlib.h> 
  #include<string.h> 
  #include<algorithm> 
  
  using namespace std; 
  
  int start,n; 
  char str[15][100]; 
  
  struct P 
    { 
  char res[100]; 
  }Ans[100]; 
  
  char dest[100]; 
  int Next[100]; 
  
  bool cmp(P a,P b) 
    { 
  return strcmp(a.res,b.res)<0; 
  } 
  
  void Sov() 
    { 
  int i; 
  for(i=1;i<n;i++) 
     { 
  if(strstr(str[i],dest)==NULL) 
     { 
  start=1; 
  return ; 
  } 
  } 
  return ; 
  } 
  
  int main() 
    { 
  int t,i,j,k,s; 
  scanf("%d",&t); 
  while(t--) 
     { 
  scanf("%d",&n); 
  memset(str,0x00,sizeof(str)); 
  for(i=0;i<n;i++) 
     { 
  scanf("%s",str[i]); 
  } 
  s=0; 
  for(i=60;i>=3;i--) 
     { 
  j=0; 
  while(j+i<=60) 
     { 
  start=0; 
  memset(dest,0x00,sizeof(dest)); 
  strncpy(dest,&str[0][j],i); 
  Sov(); 
  if(!start) 
     { 
  strcpy(Ans[s++].res,dest); 
  } 
  j++; 
  } 
  if(s)break; 
  } 
  if(s) 
     { 
  sort(Ans,Ans+s,cmp); 
  printf("%s\n",Ans[0].res); 
  } 
  else 
     { 
  printf("no significant commonalities\n"); 
  } 
  } 
  return 0; 
  } 
 KMP版本:
 
   /**//*Problem: 3080  User: Gilhirith 
  Memory: 584K  Time: 16MS 
  Language: G++  Result: Accepted*/ 
  
  #include<stdio.h> 
  #include<stdlib.h> 
  #include<string.h> 
  #include<algorithm> 
  
  using namespace std; 
  
  int start,n; 
  char str[15][100]; 
  char dest[100]; 
  int Next[100]; 
  
  struct P 
    { 
  char res[100]; 
  }Ans[100]; 
  
  int GetNextVal(char* Pattern, int next[]) 
    { 
  int i=1,j=0; 
  int p_len=strlen(Pattern); 
  next[0]=0; 
  while(i<p_len) 
     { 
  if(Pattern[i]==Pattern[j]) 
     { 
  next[i]=j+1; 
  i++; 
  j++; 
  } 
  else if(j>0) 
     { 
  j=next[j-1]; 
  } 
  else 
     { 
  next[i]=0; 
  i++; 
  } 
  } 
  return 0; 
  } 
  
  int kmpMatch(char* Src, char* Pattern, int pos) 
    { 
  int i=pos,j=0; 
  int s_len,p_len; 
  s_len=strlen(Src); 
  p_len=strlen(Pattern); 
  while(i<s_len) 
     { 
  if(Src[i]==Pattern[j]) 
     { 
  if(j==p_len-1)return i-p_len+1; 
  i++; 
  j++; 
  } 
  else if(j>0) 
     { 
  j=Next[j-1]; 
  } 
  else 
  i++; 
  } 
  return -1; 
  } 
  
  bool cmp(P a,P b) 
    { 
  return strcmp(a.res,b.res)<0; 
  } 
  
  void Sov() 
    { 
  int i; 
  for(i=1;i<n;i++) 
     { 
  if(kmpMatch(str[i], dest, 0)==-1) 
     { 
  start=1; 
  return ; 
  } 
  } 
  return ; 
  } 
  
  int main() 
    { 
  int t,i,j,k,s; 
  scanf("%d",&t); 
  while(t--) 
     { 
  scanf("%d",&n); 
  for(i=0;i<n;i++) 
     { 
  scanf("%s",str[i]); 
  } 
  s=0; 
  for(i=60;i>=3;i--) 
     { 
  j=0; 
  while(j+i<=60) 
     { 
  start=0; 
  memset(dest,0x00,sizeof(dest)); 
  strncpy(dest,&str[0][j],i); 
  GetNextVal(dest,Next); 
  Sov(); 
  if(!start) 
     { 
  strcpy(Ans[s++].res,dest); 
  } 
  j++; 
  } 
  if(s)break; 
  } 
  if(s) 
     { 
  sort(Ans,Ans+s,cmp); 
  printf("%s\n",Ans[0].res); 
  } 
  else 
     { 
  printf("no significant commonalities\n"); 
  } 
  } 
  return 0; 
  } 
 
 
	    
    
 |