您的位置:首页 > 其它

【POJ】1816 Wild Words

2014-06-28 12:47 337 查看
DFS+字典树。题目数据很BT。注意控制DFS深度小于等于len。当'\0'时,还需判断末尾*。另外,当遇到*时,注意讨论情况。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;

#define TRIEN 28

typedef struct Trie {
vector<int> vc;
Trie *next[TRIEN];
Trie() {
for (int i=0; i<TRIEN; ++i)
next[i] = NULL;
}
} Trie;

Trie root;
char buf[25];
int nums[100005], nn, len;

void create(char str[], int in) {
int i = 0, id;
Trie *p = &root, *q;

while (str[i]) {
if (str[i] == '?')
id = 26;
else if (str[i] == '*')
id = 27;
else
id = str[i] - 'a';
++i;
if (p->next[id] == NULL) {
q = new Trie();
p->next[id] = q;
}
p = p->next[id];
}
p->vc.push_back(in);
}

void find(Trie *p, int d, int f) {
int id;
if (d > len)
return ;
if (buf[d] == '\0') {
int vcn = p->vc.size();
int i;
if (vcn) {
for (i=0; i<vcn; ++i)
nums[nn++] = p->vc[i];
}
if (p->next[27])
find(p->next[27], d, 0);
return ;
}

id = buf[d] - 'a';
if (p->next[id])
find(p->next[id], d+1, 0);
if (p->next[26])
find(p->next[26], d+1, 0);
if (p->next[27]) {
find(p->next[27], d+1, 1);
find(p->next[27], d, 1);
}
if (f)
find(p, d+1, 1);
}

int main() {
int n, m, i;

scanf("%d %d", &n, &m);

for (i=0; i<n; ++i) {
scanf("%s", buf);
create(buf, i);
}

while (m--) {
scanf("%s", buf);
nn = 0;
len = strlen(buf);
find(&root, 0, 0);
if (!nn) {
printf("Not match\n");
continue;
}
sort(nums, nums+nn);
printf("%d", nums[0]);
for (i=1; i<nn; ++i)
if (nums[i] != nums[i-1])
printf(" %d", nums[i]);
printf("\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: