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);}}
思路:
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
- poj 3080 暴力法 KMP+暴力枚举
- poj 3450 KMP+暴力枚举(类似于3080)
- POJ 3080 Blue Jeans 暴力枚举+KMP
- POJ 3080 Blue Jeans kmp+暴力枚举
- poj 3080 Blue Jeans 【KMP 暴力枚举】
- POJ 3080--Blue Jeans【KMP && 暴力枚举】
- poj 3080 KMP+暴力
- POJ 3080 Blue Jeans(暴力枚举+kmp)
- POJ 3080 Blue Jeans (KMP+暴力枚举)【模板】
- POJ 1226 Substrings 暴力枚举+KMP算法
- POJ 3450 Corporate Identity 暴力枚举+KMP
- POJ 3450Corporate Identity(暴力枚举+KMP)
- poj 3102(暴力枚举)
- POJ 2718 暴力枚举
- POJ-----3279暴力枚举
- POJ 3174 暴力枚举
- POJ 3080 Blue Jeans(暴力枚举+KMP 类似POJ 3450)
- Corporate Identity (KMP+暴力枚举)
- Entity Framework学习笔记——EF简介(一篇文章告诉你什么是EF)
- Linux常用命令(二十三) - chgrp
- 学习Unity3D第十天之数组例题解析和类。
- if经验
- 注解
- poj 3080 暴力法 KMP+暴力枚举
- Linux crontab任务调度
- 使用线程池以及FutureTask管理多线程任务
- Android实现程序之间的跳转
- 我花了几乎一年的时间去证明我选择的错误
- 关于Asp.net负载均衡的一些说明介绍
- poj 1111 Image Perimeters
- Netapp存储模拟器一战成功
- Effective Modern C++ 笔记 第五章:Rvalue References, Move Semantics, and Perfect Forwarding