zoukankan      html  css  js  c++  java
  • kuangbin专题十六 KMP&&扩展KMP HDU1238 Substrings

    You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings.

    InputThe first line of the input file contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains a single integer n (1 <= n <= 100), the number of given strings, followed by n lines, each representing one string of minimum length 1 and maximum length 100. There is no extra white space before and after a string.
    OutputThere should be one line per test case containing the length of the largest string found.
    Sample Input
    2
    3
    ABCD
    BCDFF
    BRCD
    2
    rose
    orchid
    Sample Output
    2
    2



    这道题和之前一道题类似,都是多个字符串匹配问题,只是这道题多了倒序的匹配。直接reverse就可以了
    遍历第一个串的所有后缀,然后匹配每个字符串的正反序。得到公共匹配的最小。然后枚举所有后缀取最大

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<string>
     4 #include<algorithm>
     5 #include<vector>
     6 using namespace std;
     7 int _,n,Next[110];
     8 vector<string> t;
     9 
    10 void prekmp(string s) {
    11     int len=s.size();
    12     int i,j;
    13     j=Next[0]=-1;
    14     i=0;
    15     while(i<len) {
    16         while(j!=-1&&s[i]!=s[j]) j=Next[j];
    17         Next[++i]=++j;
    18     }
    19 }
    20 
    21 int kmp(string t,string p) {
    22     int lent=t.size(),lenp=p.size();
    23     int i=0,j=0,ans=-1,res;
    24     res=-1;
    25     while(i<lent) {
    26         while(j!=-1&&t[i]!=p[j]) j=Next[j];
    27         ++i;++j;
    28         res=max(res,j);
    29     }
    30     ans=max(ans,res);
    31     reverse(t.begin(),t.end());
    32     res=-1;
    33     i=0,j=0;
    34     while(i<lent) {
    35         while(j!=-1&&t[i]!=p[j]) j=Next[j];
    36         ++i;++j;
    37         res=max(res,j);
    38     }
    39     ans=max(ans,res);
    40     return ans;
    41 }
    42 
    43 int main() {
    44    // freopen("in","r",stdin);
    45     for(scanf("%d",&_);_;_--) {
    46         scanf("%d",&n);
    47         string s;
    48         for(int i=0;i<n;i++) {
    49             cin>>s;
    50             t.push_back(s);
    51         }
    52         string str=t[0],tempstr;
    53         int len=str.size(),maxx=-1;
    54         for(int i=0;i<len;i++) {
    55             tempstr=str.substr(i,len-i);
    56             int ans=0x3f3f3f;
    57             prekmp(tempstr);
    58             for(int j=1;j<t.size();j++) {
    59                 ans=min(kmp(t[j],tempstr),ans);
    60             }
    61             maxx=max(maxx,ans);
    62         }
    63         printf("%d
    ",maxx);
    64         t.clear();
    65     }
    66 }




  • 相关阅读:
    STM32时钟树
    js jQuery函数 $.ajax()
    jQuery 语法
    jQuery介绍
    python笔记2 生成器 文件读写
    python笔记1,语法,函数,类和实例,异常
    Scrapy爬虫入门系列4抓取豆瓣Top250电影数据
    Scrapy爬虫入门系列3 将抓取到的数据存入数据库与验证数据有效性
    opus 规范 与参数解析
    开源播放器ijkplayer源码结构
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/10299885.html
Copyright © 2011-2022 走看看