hdu 1238 Substrings

简介: 点击打开链接hdu 1238 思路:kmp+暴力枚举子串 分析: 1 题目要求找到一个子串x,满足x或x的逆串是输入的n个字符串的子串,求最大的x,输出x的长度 2 题目的n最大100,每一个字符串的最大长度为100,那么暴力枚举子串就是o(n^2)才10000肯定是不会超时的,但是由于这里涉及到了逆串的问题,所以我们应该还要求出n个子串的逆串,然后在求最大的x。

点击打开链接hdu 1238


思路:kmp+暴力枚举子串
分析:
1 题目要求找到一个子串x,满足x或x的逆串是输入的n个字符串的子串,求最大的x,输出x的长度
2 题目的n最大100,每一个字符串的最大长度为100,那么暴力枚举子串就是o(n^2)才10000肯定是不会超时的,但是由于这里涉及到了逆串的问题,所以我们应该还要求出n个子串的逆串,然后在求最大的x。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

#define MAXN 110

int t , n;
char words[MAXN*2][MAXN];
int next[MAXN];

/*qsort按照长度排序*/
int cmp(const void *str1 , const void *str2){
    return strlen((char*)str1)-strlen((char*)str2);
}

/*求反转字符串*/
void init(){
    for(int i = 0 ; i < n ; i++){
       int pos = 0;
       for(int j = strlen(words[i])-1 ; j >= 0 ; j--)
          words[i+n][pos++] = words[i][j];
       words[i+n][pos] = '\0';
    }
}

/*求next数组*/
void getNext(char *str){
    int len = strlen(str);
    next[0] = next[1] = 0;
    for(int i = 1 ; i < len ; i++){
       int j = next[i];
       while(j && str[i] != str[j])
          j = next[j];
       next[i+1] = str[i] == str[j] ? j+1 : 0;
    }
}

/*匹配函数*/
bool find(char *words , char *str){
    int len = strlen(words);
    int m = strlen(str);
    int j = 0;
    for(int i = 0 ; i < len ; i++){
       while(j && words[i] != str[j])
          j = next[j];
       if(words[i] == str[j])
          j++;
       if(j == m)/*找到了就return true*/
          return true;
    }
    return false;
}

int main(){
   char max[MAXN];
   scanf("%d" , &t);
   while(t--){
      scanf("%d" , &n);
      for(int i = 0 ; i < n ; i++)
         scanf("%s" , words[i]);
      
      /*排序*/
      qsort(words , n , sizeof(words[0]) , cmp);

      /*反转字符串*/
      init();

      char tmp[MAXN];
      int pos;
      int len = strlen(words[0]);
      memset(max , '\0' , sizeof(max));
      /*枚举正向的子串*/
      for(int i = 0 ; i < len ; i++){
         pos = 0;
         memset(tmp , '\0' , sizeof(tmp));
         for(int j = i ; j < len ; j++){
            tmp[pos++] = words[0][j];
           
            getNext(tmp);
            int vis = 1;
            
            for(int k = 1 ; k < n ; k++){
               if(!find(words[k] , tmp) && !find(words[k+n] , tmp)){
                  vis = 0;
                  break;   
               }  
            }
            if(vis && strcmp(max , tmp) < 0)
               memcpy(max , tmp , sizeof(tmp));
         }
      }

      /*枚举反向的子串*/
      for(int i = 0 ; i < len ; i++){
         pos = 0;
         memset(tmp , '\0' , sizeof(tmp));
         for(int j = i ; j < len ; j++){
            tmp[pos++] = words[n][j];
           
            getNext(tmp);
            int vis = 1;
            
            for(int k = 0 ; k < n ; k++){
               if(!find(words[k] , tmp) && !find(words[k+n] , tmp)){
                  vis = 0;
                  break;   
               }  
            }
            if(vis && strcmp(max , tmp) < 0)
               memcpy(max , tmp , sizeof(tmp));
         }
      }
      printf("%d\n" , strlen(max));/*输出长度*/
   }
   return 0;
}



目录
相关文章
|
存储 Shell Android开发
Android--adb命令查看第三方应用包名、应用activity名
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/78038767 (adb s...
5220 0
|
12月前
|
搜索推荐 UED
「Mac畅玩鸿蒙与硬件30」UI互动应用篇7 - 简易计步器
本篇将带你实现一个简易计步器应用,用户通过点击按钮增加步数并实时查看步数进度,目标步数为 10000 步。该项目示例展示了如何使用 Progress 组件和 Button 组件,并结合状态管理,实现交互式应用。
265 2
「Mac畅玩鸿蒙与硬件30」UI互动应用篇7 - 简易计步器
|
机器学习/深度学习 人工智能 安全
智能时代的隐私守护者:AI加密技术的崛起与挑战###
本文深入探讨了人工智能(AI)在数据加密领域的创新应用,分析了AI如何增强数据安全性,同时也指出了面临的挑战和未来发展趋势。通过具体案例分析,展现了AI加密技术在保护个人隐私与促进数据安全方面的潜力,为读者提供对未来智能时代隐私保护的深刻洞见。 ###
|
Java Maven Windows
SpringBoot工程打包与运行(Windows版)
SpringBoot工程打包与运行(Windows版)
SpringBoot工程打包与运行(Windows版)
|
编解码 小程序 算法
自己动手写RTP服务器——关于RTP协议
本文会带领着你一步步动手实现一个简单的RTP传输服务器,旨在了解RTP流媒体传输协议以及一些关于多媒体编解码的知识。   关于RTP协议的必备知识 要动手实现一个协议,当然首先需要阅读该协议的文档。
2052 0
|
小程序 数据格式
微信小程序事件通道使用教程
微信小程序事件通道使用教程
|
存储 弹性计算 应用服务中间件
阿里云服务器续费方法流程及续费时长折扣对照表
阿里云服务器续费很简单,在云服务器控制台即可续费。云服务器续费时长不同享受的优惠折扣也不同
1630 0
阿里云服务器续费方法流程及续费时长折扣对照表
|
数据处理
「连接平台」钉钉与电商ERP系统打通,流程超自动化助力业务起飞
数环通基于连接平台iPass能力完成了与钉钉的深度融合,打通了电商平台与企业ERP系统之间的数据桥梁,应用通过连接平台的数据处理和字段匹配做串联,实现数据线上线下自动同步与集成,提高企业运营管理效率和准确性,为企业数字化赋能升级。
1765 0
|
弹性计算 网络协议 应用服务中间件
阿里云服务器开启8080端口图文教程
阿里云服务器8080端口默认是不开启的,默认只开通22和3389端口,阿里云服务器端口是在安全组中配置,端口号来详细说下阿里云服务器8080端口开启教程
阿里云服务器开启8080端口图文教程
(4)(4.6.6) 罗盘校准
(4)(4.6.6) 罗盘校准
411 0