生物基元问题

Description

一个生物体的结构可以用“基元”的序列表示,一个“基元"用一些英文字符串表示。对于一个基元集合P,可以将字符串S看作由n个基元P1,P2,…,Pn依次连接而成的。问题是给定一个字符串S和一个基元集合P,使S的前缀可由P中的基元组成。求这个前缀的最大长度。基元的个数最大为20,长度最大为20,字符中的长度最大为500000.例如基元集合为{A,AB,BBC,CA },字符串为ABACABBCAACCB,则最大长度为10,其具体组成为ABACABBCAA 2214433311

Input

第一行为字符串S,第二行为一个整数m,表示基元数 以下m行,每行一个基元

Output

只有一个整数,表示字符串S中能得到的最大前缀长度。

Sample Input

ABACABBCAACCB
4
A
AB
BBC
CA

Sample Output

10

HINT

Source

#include <bits/stdc++.h>
using namespace std;
char s[500011], a[30][30];
int n, slen, len[30];
bool f[500011];
bool check(int pos, int t) {
    for (int i = 1; i <= len[t]; i ++) {
        if (s[pos + i - 1] != a[t][i]) {
            return 0;
        }
    }
    return 1;
}
int main() {
    scanf("%s", s + 1);
    slen = strlen(s + 1);
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        scanf("%s", a[i] + 1);
        len[i] = strlen(a[i] + 1);
    }
    memset(f, 0, sizeof(f));
    f[0] = 1;
    for (int i = 0; i <= slen; i ++) {
        if (f[i] == 1) {
            for (int j = 1; j <= n; j ++) {
                if (check(i + 1, j) == 1) {
                    f[i + len[j]] = 1;
                }
            }
        }
    }
    for (int i = slen; i >= 0; i --) {
        if (f[i] == 1) {
            cout << i << endl;
            return 0;
        }
    }
    return 0;
}

/**************************************************************
    Problem: 1613
    User: LJA001162
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:2512 kb
****************************************************************/
02-01 00:33