生物基元问题
生物基元问题
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
****************************************************************/