poj 3080 暴力法 KMP+暴力枚举

来源:互联网 发布:java经典代码 编辑:程序博客网 时间:2024/05/16 14:09
#include<iostream>#include<string.h>using namespace std;char DNA[10][61];//存储字符串char SubStr[61];//存储子串char MaxStr[61];//最长子串int main(){int test;scanf("%d",&test);for(int i=1;i<=test;i++){//初始化memset(DNA,0,sizeof(DNA));memset(SubStr,0,sizeof(SubStr));memset(MaxStr,0,sizeof(MaxStr));int n;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%s",&DNA[i]);int length=1;//子串长度int MaxLength=0;int flag;//子串长度的范围for(length=1;length<=60;length++){   //处理所有子串for(int i=0;i<60-length+1;i++){   //保存子串flag=false;for(int j=0;j<length;j++)SubStr[j]=DNA[0][i+j];SubStr[length]='\0';for(int j=1;j<n;j++){if(0==strstr(DNA[j],SubStr))//若不是某一字符串的子串{  flag=true;break;}}if(!flag)//该字符串是公共子串{if(length>MaxLength){   strcpy(MaxStr,SubStr);MaxLength=length;}else if(length==MaxLength){if(strcmp(SubStr,MaxStr)<0)strcpy(MaxStr,SubStr);}}}}if(MaxLength<3)printf("%s\n","no significant commonalities");elseprintf("%s\n",MaxStr);}}


132K0MS

思路:

DNA[0]为基准,选取DNA[0]各个长度的子串,然后与其他串比较,看其他串是否含有该子串。

函数说明:
包含文件:string.h
函数名: strstr
函数原型:extern char *strstr(char *str1, char *str2);
功能:从字符串str1中查找是否有字符串str2, 如果有,从str1中的str2位置起,返回str1的指针,如果没有,返回null。
返回值:返回该位置的指针,如找不到,返回空指针。


KMP+暴力枚举 

#include<iostream>#include<string.h>using namespace std;char DNA[10][61];char SubStr[61];char MaxStr[61];//最长子串int tmp[62];void GetNext(char* p,int next[]){int pLen=strlen(p);next[0]=-1;next[1]=0;int k=0;for(int j=1;j<pLen;j++){if(p[k]==p[j]){k++;next[j+1]=k;}else{do{k=next[k];}while((k>=0)&&(p[k]!=p[j]));k++;//k=-1;或p[k]=p[j]next[j+1]=k;}}}bool KmpSearch(char* s,char *p,int* next){int i=0,j=0;int sLen=strlen(s);int pLen=strlen(p);int count=0;while(i<sLen){if(s[i]==p[j]){i++;j++;if(j==pLen){return true;j=next[j];}}else{j=next[j];//next[0]=-1;if(-1==j) { j++;i++;}}}return false;}bool IsSubStr(char* s,char *p){GetNext(p,tmp);return KmpSearch(s,p,tmp);}int main(){int test;scanf("%d",&test);for(int i=1;i<=test;i++){//初始化memset(DNA,0,sizeof(DNA));memset(SubStr,0,sizeof(SubStr));memset(MaxStr,0,sizeof(MaxStr));int n;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%s",&DNA[i]);int length=1;//子串长度int MaxLength=0;int flag;for(length=1;length<=60;length++){   //处理所有子串for(int i=0;i<60-length+1;i++){   //保存子串flag=false;for(int j=0;j<length;j++)SubStr[j]=DNA[0][i+j];SubStr[length]='\0';if(strcmp(SubStr,"ABC")==0)int a=1;for(int j=1;j<n;j++){if(!IsSubStr(DNA[j],SubStr))//若不是某一字符串的子串{  flag=true;break;}}if(!flag)//该字符串是公共子串{if(length>MaxLength){   strcpy(MaxStr,SubStr);MaxLength=length;}else if(length==MaxLength){if(strcmp(SubStr,MaxStr)<0)strcpy(MaxStr,SubStr);}}}}if(MaxLength<3)printf("%s\n","no significant commonalities");elseprintf("%s\n",MaxStr);}}
132K32MSKMP算法用来取代暴力法的函数:

strstr();



0 0
原创粉丝点击