HDU-1238-Substrings(KMP, 暴力枚举)

Posted ydddd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-1238-Substrings(KMP, 暴力枚举)相关的知识,希望对你有一定的参考价值。

链接:

https://vjudge.net/problem/HDU-1238

题意:

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.

思路:

n个字符串的最长子串, 反着的也可以.
枚举第一个的子串, 对剩下的挨个匹配.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
//#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#include <string>
#include <assert.h>
#include <iomanip>
#include <iostream>
#include <sstream>
#define MINF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 200;
const int MOD = 1e4+7;

string ori[MAXN], rev[MAXN];
int Next[MAXN];
int n;

void GetNext(string t)

    int i = 0, k = -1;
    int len = t.length();
    Next[0] = -1;
    while (i < len-1)
    
        if (k == -1 || t[i] == t[k])
        
            ++i;
            ++k;
            Next[i] = k;
        
        else
            k = Next[k];
    



bool Kmp(string s, string t)

    int i = 0, j = 0;
    int lens = s.length(), lent = t.length();
    while (i < lens && j < lent)
    
        if (j == -1 || s[i] == t[j])
        
            ++i;
            ++j;
        
        else
            j = Next[j];
    
    return j >= lent;


int main()

    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--)
    
        cin >> n;
        for (int i = 1;i <= n;i++)
        
            cin >> ori[i];
            rev[i].assign(ori[i].rbegin(), ori[i].rend());
        
        int len = ori[1].length();
        int ans = 0;
        for (int i = 0;i < len;i++)
        
            for (int j = i;j < len;j++)
            
                string p(ori[1], i, j-i+1);
                GetNext(p);
                bool flag = true;
                for (int k = 2;k <= n;k++)
                
                    if (!Kmp(ori[k], p) && !Kmp(rev[k], p))
                    
                        flag = false;
                        break;
                    
                
                if (flag && (int)p.length() > ans)
                    ans = (int)p.length();
            
        
        cout << ans << endl;
    

    return 0;

以上是关于HDU-1238-Substrings(KMP, 暴力枚举)的主要内容,如果未能解决你的问题,请参考以下文章

kuangbin专题十六 KMP&&扩展KMP HDU1238 Substrings

HDU 1238 Substrings (水)

kmp算法啥意思?

扩展kmp

kmp算法详解

hdu-4763(kmp+拓展kmp)