• poj3450 Corporate Identity KMP+枚举


    http://poj.org/problem?id=3450

    给数个字符串,若这些字符串中拥有相同的子串,求最大长度的子串,长度相等取ASCII码小的。

    这题也是可以用KMP算法来解,用一个字符串枚举去匹配其它的串,找到一个最长的就可以了。当然时间要用得长一些了。

    Source Code

    Problem: 3450   User: 541780774
    Memory: 920K   Time: 282MS
    Language: G++  

    Result: Accepted

    Source Code

    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    int next[202],n,T,flag,minlen;
    struct {
           char str[202];
           int len;
           }r,s[4004],t,ans;
    void get_next()//求模式串的“next[]”值
    {
         long i=0,j=-1;
         next[0]=-1;
         while(i<=t.len)
         {
           if(j==-1||t.str[i]==t.str[j])
             next[++i]=++j;
           else j=next[j];
         }
    }
    int kmp()
    {
        int h,i,j,max,min=99999;
        for(h=0;h<T;h++)
          if(h!=flag)
          {
              i=0;j=0;max=0;
              while(i<s[h].len&&j<t.len)
             {
                if(j==-1||s[h].str[i]==t.str[j])
                {
                  i++;j++;
                  if(j>max)
                     max=j;
                }
                else
                {
                     if(j>max)//匹配串与某主串最长的匹配长度max;
                     max=j;
                     j=next[j];
                }
             }
             if(max<min) //该匹配串与所有的主串的匹配长度max中取最小min
                min=max;
          }
             return min;
    }
    main()
    {
       long i,a,max;
       while(scanf("%d",&T),T)
       {
          getchar();
          minlen=99999;
          max=0;
          flag=10000;
          for(i=0;i<T;i++)
          {
             gets(s[i].str);
             s[i].len=strlen(s[i].str);
             if(s[i].len<minlen)
             {
              minlen=s[i].len;
              flag=i; //标记长度最小的字符,做为子串;其它串做为主串
             }
          }
          for(i=0;i<minlen;i++)
          {
            strcpy(t.str,s[flag].str+i);//枚举子串所有拿去匹配的串
            t.len=strlen(t.str);
            get_next();
            a=kmp();
            if(a>max)
            {
               max=a;
               strncpy(ans.str,s[flag].str+i,a);
               ans.str[a]='\0';
            }
            else if(a==max)   //如果两字符串长度相等,取小串的;取ASCII码值小的串
            {
               strncpy(r.str,s[flag].str+i,a);
               r.str[a]='\0';
               if(strcmp(ans.str,r.str)>0)
                 strcpy(ans.str,r.str);
            }
          }
          if(max==0)
              printf("IDENTITY LOST\n");
          else
              printf("%s\n",ans.str);
       }
       system("pause");
    }

  • 相关阅读:
    Python时间戳
    vux x-input 清除按钮不起作用
    MySQL连接查询流程源码
    Linux下用的脚本
    TableCache设置过小造成MyISAM频繁损坏 与 把table_cache适当调小mysql能更快地工作
    批量导入数据到InnoDB表速度优化
    DBA面对新mysql环境
    (进阶篇)PHP+Mysql+jQuery找回密码
    (进阶篇)PHP实现用户注册后邮箱验证,激活帐号
    (实用篇)php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740277.html
Copyright © 2020-2023  润新知