|
Posted on 2009-10-13 22:46 Uriel 阅读(840) 评论(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; }
|