您的位置:首页 > 其它

POJ 1816 Wild Words

2016-07-31 14:15 197 查看
对所有模式串建trie树,

对每一个字符串在trie树上进行DFS统计答案,

注意’*’可以包含任意多的字符,也不包含任何字符!

trie树好久没写,写不熟了。写的时候借鉴了一下各路神犇的代码^_^

#include<cstdio>
#include<vector>
#include<cstring>
#define MAXN 100010
#define MAXM 110
using namespace std;
int ans[MAXN], n, m;
char s[25];
struct node
{
node *next[30];
vector<int> val;
node(){memset(next,0,sizeof(next));}
};
struct TRIE
{
int len;
node *root;
void pre(){root = new node();}
int idx(char ch)
{
if(ch=='?')return 'z'-'a'+1;
if(ch=='*')return 'z'-'a'+2;
else return ch-'a';
}
void insert(char *s, int id)
{
len=strlen(s);
node *p=root;
for(int i = 0; i < len; i++)
{
int c = idx(s[i]);
if(!p->next[c])
p->next[c]=new node();
p=p->next[c];
}
p->val.push_back(id);
}
void dfs(char *s, node *p, int pos)
{
if(s[pos]==0)
{
for(int i = 0; i < p->val.size(); i++)
{
ans[p->val[i]]=1;
}
if(p->next[idx('*')])
dfs(s,p->next[idx('*')],pos);
}
else
{
int c=idx(s[pos]);
if(p->next[c])dfs(s,p->next[c],pos+1);
if(p->next[idx('?')])dfs(s,p->next[idx('?')],pos+1);
if(p->next[idx('*')])
for(int i = pos; i <= len; i++)
dfs(s,p->next[idx('*')],i);
}
}
void find(char *s)
{
len=strlen(s);
memset(ans,0,sizeof(ans));
dfs(s,root,0);
bool mat=0;
for(int i = 1; i <= n; i++)
{
if(ans[i])
{
mat=1;
printf("%d ",i-1);
}
}
if(!mat)
printf("Not match");
printf("\n");
}
}trie;
int main()
{
scanf("%d%d",&n,&m);
trie.pre();
for(int i = 1; i <= n; i++)
{
scanf("%s",s);
trie.insert(s,i);
}
for(int i = 1; i <= m; i++)
{
scanf("%s",s);
trie.find(s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: