如果不说kmp的话,3个题目都可以说是水题,kmp上数据结构的时候学过,但没研究过,不是很懂。这3个题目都是一个类型,只说下1374,其他两题都是其简化版,唯一难点的可能在于输出要按字典序。。。暂时也没想看kmp。>,<
zoj 1374 Substrings题意:
给出n个字符串,要求从中找出最长子串,正反都行。
分析:
先找出其中最短字符串,再枚举之中的子串,然后在全部串中查找。
强大的strstr函数:
strstr(char *haystack,char *needle) :
从字符串haystack中寻找needle第一次出现的位置。、、
#include<stdio.h> #include<string.h> int main() { char str[105][105],up[105],back[105]; int t,n,i,j,k,min,temp,len,num; scanf("%d",&t); while(t--) { scanf("%d",&n); min=999; for(i=0;i<n;i++) { scanf("%s",str[i]); len=strlen(str[i]); if(min>len) { min=len; temp=i; } } for(i=1;i<=min;i++)//i是目标子串的终点故.... { for(j=0;j+i-1<min;j++)//j+i-1是目标子串的长度,j是起点 { for(k=0;k<i;k++)//构造正反串 { up[k]=str[temp][k+j]; back[k]=str[temp][i+j-k-1];//搞造反串这里还是有点问题。 } up[k]='\0'; back[k]='\0';//这里不可省略,字符串数组的结束标志 for(k=0;k<n;k++)//查找,strstr函数的巧妙运用 { if(strstr(str[k],up)==NULL&&strstr(str[k],back)==NULL) break; } if(k>=n) { num=i; } } } printf("%d\n",num); } return 0; }
#include<stdio.h> #include <string.h> int main() { int n,m; char str[12][62],a[62],b[62]; int i,j,len,num,tmp,k,t; scanf("%d",&n); while(n--) { num=0; scanf("%d",&m); for(i=0;i<m;i++) scanf("%s",str[i]); len=strlen(str[0]); for(i=1;i<=len;i++) { for(j=0;j+i-1<len;j++) { for(k=0;k<i;k++) { a[k]=str[0][j+k]; } a[k]='\0'; for(k=0;k<m;k++) { if(strstr(str[k],a)==NULL) break; } if(k>=m) { tmp=strlen(a); if(tmp==num) { for(t=0;t<num;t++) { if(a[t]<b[t]) { for(t=0;t<=num;t++) b[t]=a[t]; break; } } } if(tmp>num) { num=tmp; for(t=0;t<=num;t++) { b[t]=a[t]; } } } } } if(num>=3) printf("%s\n",b); else printf("no significant commonalities\n"); } return 0; }
zoj 2907 Corporate Identity,==b
差不多的题目。将暴力进行到底!!!
#include<stdio.h> #include <string.h> int main() { int m; char str[4005][205],a[205],b[205]; int i,j,len,num,tmp,k,t,l1=255,pos; while(scanf("%d",&m)!=EOF) { num=0; l1=255; if(m==0) break; for(i=0;i<m;i++) { scanf("%s",str[i]); len=strlen(str[i]); if(len<l1) { l1=len; pos=i; } } for(i=1;i<=l1;i++) { for(j=0;j+i-1<l1;j++) { for(k=0;k<i;k++) { a[k]=str[pos][j+k]; } a[k]='\0'; for(k=0;k<m;k++) { if(strstr(str[k],a)==NULL) break; } if(k>=m) { tmp=strlen(a); if(tmp==num) { for(t=0;t<num;t++) { if(a[t]>b[t]) break; if(a[t]<b[t]) { for(t=0;t<=num;t++) b[t]=a[t]; break; } } } if(tmp>num) { num=tmp; for(t=0;t<=num;t++) { b[t]=a[t]; } } } } } if(num>=1) printf("%s\n",b); else printf("IDENTITY LOST\n"); } return 0; } /* 3 abcclaab abccdaab abcckaab */ /* 3 asdsaaa sdswssaaa sdsaaa */