zoukankan      html  css  js  c++  java
  • Match:Blue Jeans(POJ 3080)

                    

                      DNA序列

      题目大意:给你m串字符串,要你找最长的相同的连续字串

      这题暴力kmp即可,注意要按字典序排序,同时,是len<3才输出no significant commonalities

      

      1 #include <iostream>
      2 #include <functional>
      3 #include <algorithm>
      4 #include <string.h>
      5 #define MAX 60
      6 
      7 using namespace std;
      8 
      9 typedef char* _String;
     10 typedef int Position;
     11 static char str[11][61],ans[62];
     12 static int _next[62];
     13 
     14 bool KmpSearch(_String, _String, const int);
     15 void Get_Next(_String, const int);
     16 void Search(const int);
     17 
     18 int main(void)//暴力枚举第一行
     19 {
     20     int case_sum, m;
     21     //freopen("in.txt", "r", stdin);
     22     scanf("%d", &case_sum);
     23 
     24     while (case_sum--)
     25     {
     26         scanf("%d", &m);
     27         getchar();
     28         
     29         for (int i = 0; i < m; i++)
     30             scanf("%s", str[i]);
     31         Search(m);
     32     }
     33     return EXIT_SUCCESS;
     34 }
     35 
     36 void Search(const int m)
     37 {
     38     int len, ans_len = -1, pos, if_match;
     39     char tmp;
     40 
     41     for (len = 1; len <= MAX; len++)
     42     {
     43         for (pos = 0; pos + len <= MAX; pos++)
     44         {
     45             if_match = 0;
     46             Get_Next(&str[0][pos], len);
     47             for (int i = 1; i < m; i++)
     48                 if_match += KmpSearch(str[i], &str[0][pos], len);
     49             if (if_match == m - 1 && len >= ans_len)
     50             {
     51                 if (len == ans_len)
     52                 {
     53                     tmp = str[0][pos + len];
     54                     str[0][pos + len] = '';
     55                     if (strcmp(&str[0][pos], ans) < 0)
     56                         strcpy(ans, &str[0][pos]);
     57                     str[0][pos + len] = tmp;
     58                 }
     59                 else if (len > ans_len)
     60                 {
     61                     ans_len = len;
     62                     tmp = str[0][pos + len];
     63                     str[0][pos + len] = '';
     64                     strcpy(ans, &str[0][pos]);
     65                     str[0][pos + len] = tmp;
     66                 }
     67             }
     68         }
     69     }
     70     if (ans_len < 3)
     71         printf("no significant commonalities
    ");
     72     else
     73         printf("%s
    ", ans);
     74 }
     75 
     76 bool KmpSearch(_String str_m, _String text, const int t_len)
     77 {
     78     Position i = 0, j = 0;
     79 
     80     while (i < MAX && j < t_len)
     81     {
     82         if (j == -1 || str_m[i] == text[j])
     83         {
     84             i++;
     85             j++;
     86         }
     87         else j = _next[j];
     88     }
     89     if (j == t_len)
     90         return true;
     91     else
     92         return false;
     93 }
     94 
     95 void Get_Next(_String text, const int t_len)
     96 {
     97     Position i = 0, k = -1;
     98     _next[0] = -1;
     99 
    100     while (i < t_len)
    101     {
    102         if (k == -1 || text[i] == text[k])
    103         {
    104             i++;
    105             k++;
    106             _next[i] = text[i] != text[k] ? k : _next[k];
    107         }
    108         else k = _next[k];
    109     }
    110 }

      

  • 相关阅读:
    面向对象编程,其属性特性,用法等
    re正则模块细解,面向对象编程思路的优劣。
    机器人学——1.2-三维空间位姿描述
    机器人学——1.1-二维空间位姿描述
    机器人学——1.0-位置与姿态概述
    latex教程:1.2-latex现状
    latex教程: 1.1-历史
    windows安装opencv
    使用pip安装Opencv
    在Ubuntu上安装opencv-python
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/5182370.html
Copyright © 2011-2022 走看看