poj3080 Blue Jeans

来源:互联网 发布:java权限管理框架源码 编辑:程序博客网 时间:2024/06/06 01:21

原题链接:Blue Jeans

题意:n组测试数据,魅族m行输入一个由ATGC组成的长为60的字符串,找最长公共子串,长度相同按字典序最小输出

思路:枚举第一个字符串的字串,判断是否与其它字符串匹配,取最长字典序最小的

#include <cstdio>#include <cstring>using namespace std;char str[12][65];char sub[65], ans[65];int main(){int T, n;scanf("%d", &T);while(T --){scanf("%d", &n);int i, j, k;ans[0] = '\0'; //初始化答案为长度为0 for(i = 0;i < n;i ++)scanf("%s", str[i]);for(i = 1;i <= 60;i ++){//枚举字串长度 int flag1 = 0;for(j = 0;j < 60 - i + 1;j ++){//枚举字串起始位置 int flag2 = 1;int len = 0, t = j;while(len < i){//将str子串复制到sub sub[len ++] = str[0][t ++];}sub[len] = '\0';for(k = 1;k < n;k ++){//枚举其他字符串 if(!strstr(str[k], sub)){//判断是否含sub子串 flag2 = 0;break;}} if(flag2){//都含有sub子串时 flag1 = 1;if(strlen(ans) < strlen(sub)){//取子串长度大的 strcpy(ans, sub);}else if(strcmp(ans, sub) > 0){//长度相同时,取字典序小的 strcpy(ans, sub);}}}if(!flag1)//没有长度为i的公共子串,当然也没有长度大于i的子串,跳出 break;}if(strlen(ans) < 3){printf("no significant commonalities\n");}else{printf("%s\n", ans);}}return 0;}
kmp实现:

#include <cstdio>#include <cstring>using namespace std;char str[12][65];char sub[65], ans[65];int next[1010];void get_next(char t[], int next[]) { //获得next改进数组nextval数组     int lent = strlen(t);      next[0] = -1;      int k = -1, j = 0;      while (j < lent - 1)      {          //p[k]表示前缀,p[j]表示后缀            if (k == -1 || t[j] == t[k]) {              ++j; ++k;              //较之前next数组求法,改动在下面4行              if (t[j] != t[k])                  next[j] = k;   //之前只有这一行              else                  //因为不能出现t[j] = t[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]                  next[j] = next[k];          }          else {              k = next[k];          }      }  }  int index_kmp(char s[], char t[]) {  get_next(t, next);    int i = 0, j = 0;      int lens = strlen(s), lent = strlen(t);      while (i < lens && j < lent) {          //①如果j = -1,或者当前字符匹配成功(即s[i] == t[j]),都令i++,j++              if (j == -1 || s[i] == t[j]) {              i++;j++;          }         else {//②如果j != -1,且当前字符匹配失败(即s[i] != t[j]),则令 i 不变,j = next[j]              //next[j]即为j所对应的next值              j = next[j];          }      }      if(j == lent)          return i - j;      else          return -1;  }int main(){int T, n;scanf("%d", &T);while(T --){scanf("%d", &n);int i, j, k;ans[0] = '\0'; //初始化答案为长度为0 for(i = 0;i < n;i ++)scanf("%s", str[i]);for(i = 1;i <= 60;i ++){//枚举字串长度 int flag1 = 0;for(j = 0;j < 60 - i + 1;j ++){//枚举字串起始位置 int flag2 = 1;int len = 0, t = j;while(len < i){//将str子串复制到sub sub[len ++] = str[0][t ++];}sub[len] = '\0';for(k = 1;k < n;k ++){//枚举其他字符串 if(index_kmp(str[k], sub) == -1){//判断是否含sub子串 flag2 = 0;break;}} if(flag2){//都含有sub子串时 flag1 = 1;if(strlen(ans) < strlen(sub)){//取子串长度大的 strcpy(ans, sub);}else if(strcmp(ans, sub) > 0){//长度相同时,取字典序小的 strcpy(ans, sub);}}}if(!flag1)//没有长度为i的公共子串,当然也没有长度大于i的子串,跳出 break;}if(strlen(ans) < 3){printf("no significant commonalities\n");}else{printf("%s\n", ans);}}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 耐克黑色鞋褪色怎么办 买广汽传祺7s新车有问题怎么办 华为荣耀10边框掉色了怎么办 网购商家打来无货怎么办 客户拍了不发货怎么办 天猫商家欺骗买家怎么办 阿里买家投诉我发空包怎么办 苹果6s电池坏了怎么办 hm买的单鞋脏了怎么办 微店违规屏蔽搜索怎么办 ios微信支付失效怎么办 京东第三方店铺关闭怎么办 京东店铺关门了怎么办 国美退款不到账怎么办 小米小店通过了怎么办 苹果的发票丢了怎么办 苹果7p开不开机怎么办 申请退款了怎么卖家还发货怎么办 买家申请退款卖家不退款怎么办 卖家恶意不退款怎么办 欠条到期了对方不还钱怎么办 冰箱磕了一坑怎么办 办信用卡没有家庭地址的怎么办 钱付了货没收到怎么办 在苏宁易购上买东西地址错了怎么办 手机分期付款银行卡丢了怎么办 华硕笔记本鼠标不动了怎么办 韵达快递不派送怎么办 中通快递不派送怎么办 农业银行信用卡密码输错三次怎么办 农业银行卡多次输错密码怎么办 想把店长弄走怎么办 济南银座卡过期了怎么办 银座购物卡丢失后怎么办 银座的卡丢了怎么办 银行卡换了旧卡怎么办 大理市民卡丢了怎么办 市民卡内的钱怎么办 宝付支付乱扣款怎么办 苏宁任性贷逾期怎么办 第二次跟家里开口要钱还网贷怎么办