• poj 3080 Blue Jeans


    http://poj.org/problem?id=3080   题目就是让找一个公共的最长子串(连续的)

    一看就想起了用KMP算法,但是本来就不太懂,更别说用了,还是搜了一下解题报告,套用了KMP的模板

     1 #include<stdio.h>
    2 #include<string.h>
    3 #include<iostream>
    4 using namespace std;
    5 #define N 200
    6 char str[20][N];
    7
    8
    9 /*套用的KMP的模板,在模板串里求子串*/
    10 int kmp(char s[],char t[])
    11 {
    12 int next[N];
    13 int i,j,len1,len2;
    14 for(i=0;i<N;i++)
    15 next[i]=-1;
    16 len1=strlen(s);
    17 len2=strlen(t);
    18 for(j=1;j<len2;j++)
    19 {
    20 for(i=next[j-1];i>=0&&t[i+1]!=t[j];i=next[i])
    21 {
    22 next[j]=((t[i+1]==t[j])?i+1:-1);
    23 }
    24 }
    25 for(i=j=0;i<len1&&j<len2;i++)
    26 if(s[i]==t[j])
    27 j++;
    28 else if(j)
    29 j=next[j-1]+1,i--;
    30 return j==len2? i-len2:-1;
    31 }
    32 /*到这里模板接受*/
    33
    34
    35 int find(char *s,int m)
    36 {
    37 int i;
    38 for(i=1;i<m;i++)
    39 if(kmp(str[i],s)==-1) return 0;
    40 return 1;
    41 }
    42 int main()
    43 {
    44 int i,j,k;
    45 int t,m,max;
    46 char s[N],temp[N],tt[N];
    47 cin>>t;
    48 while(t--)
    49 {
    50 max=-1;
    51 cin>>m;
    52 cin>>s;
    53 for(i=1;i<m;i++)
    54 cin>>str[i];
    55 for(i=0;s[i]!='\0';i++)
    56 {
    57 for(j=i;s[j]!='\0';j++)
    58 {
    59 int cnt=0;
    60 for(k=i;k<=j;k++)
    61 temp[cnt++]=s[k];
    62 temp[cnt]='\0';
    63 if(find(temp,m))
    64 {
    65 if(j-i+1>max)
    66 {
    67 max=j-i+1;
    68 strcpy(tt,temp);
    69 }
    70 else if(j-i+1==max)
    71 {
    72 if(strcmp(tt,temp)>0)
    73 strcpy(tt,temp);
    74 }
    75 }
    76 }
    77 }
    78 if(max<3) cout<<"no significant commonalities\n";
    79 else cout<<tt<<endl;
    80 }
    81 return 0;
    82 }
  • 相关阅读:
    c# IOSerialize 验证码、图片缩放
    SqlServer 分库分表
    权限系统数据库设计
    SqlServer 读写分离
    树转二叉树
    数据结构:图的存储结构之邻接矩阵、邻接表
    【数据结构】数据结构-图的基本概念
    哈夫曼树
    二叉树遍历方法
    Oracle 检查约束check
  • 原文地址:https://www.cnblogs.com/fxh19911107/p/2380910.html
Copyright © 2020-2023  润新知