0
点赞
收藏
分享

微信扫一扫

Luogu P2292 [HNOI2004]L语言


题目链接:​​传送门​​

倒着存每一个单词,因为这样好判断是不是一个单词
对于每一个给出的文章,枚举文章长度判断是否有单词拼接

/**
* @Date: 2019-03-13T15:03:43+08:00
* @Last modified time: 2019-03-13T15:03:44+08:00
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define

using namespace std;
typedef long long ll;
struct node {
int son[27], is;
}e[A];
char s[A];
int f[A], n, m, cnt, ans;
void insert(char *s) {
int len = strlen(s), root = 0;
for (int i = len - 1; i >= 0; i--) {
int id = s[i] - 'a';
if (!e[root].son[id]) e[root].son[id] = ++cnt;
root = e[root].son[id];
}
e[root].is = 1;
}
void ask(char *s, int len, int root = 0) {
for (int i = len; i >= 0; i--) {
int id = s[i] - 'a';
if (!e[root].son[id]) return;
root = e[root].son[id];
if (!e[root].is) continue;
if (f[i - 1] or !i) f[len] = len + 1, ans = max(ans, f[len]);
}
}

int main(int argc, char const *argv[]) {
cin >> n >> m;
while (n--) {
cin >> s;
insert(s);
}
while (m--) {
cin >> s; ans = 0; memset(f, 0, sizeof f);
int len = strlen(s);
for (int i = 0; i < len; i++) ask(s, i);
cout << ans << endl;
}
}


举报

相关推荐

0 条评论