Wild Words

poj1816:http://poj.org/problem?id=1816

题意:给你n个模板串,然后每个串除了字母,还有?或者*,?可以代替任何非空单个字符,*可以替代任何长度任何串,包括空字符串。现在给以一些串,问你这些串在哪些串中出现过。

题解:trie+DFS。首先,把n个字符串放到trie中,注意,这n个串中可能有相同的字符串。然后对于每个要查询的串,从根节点进行DFS搜索,注意一些特殊处理,例如匹配到*或者?的处理。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define N 500001
 7 using namespace std;
 8 const int cha=28;
 9 struct node{
10     int num;
11     int count[30];//从根到此处是否是关键字,并且记录是多少个关键字的结尾
12     int next[cha];
13 }tree[N];
14 int ans[100002],top;
15 int n,m;
16 void init(node &a,int data){
17     a.num=0;
18     for(int i=0;i<cha;i++)
19         a.next[i] = -1;
20 }
21 int k = 1;
22 void insert(char s[],int num){
23     int p = 0;
24     for(int i=0;s[i];i++){
25         int data = s[i]-‘a‘;
26          if(s[i]==‘?‘)data=26;
27          if(s[i]==‘*‘)data=27;
28         if(tree[p].next[data]==-1){//不存在该结点
29             init(tree[k],num);
30             tree[p].next[data] = k;
31             k++;
32         }
33         p = tree[p].next[data];
34     }
35     int temp=tree[p].num;
36     tree[p].num++;
37     tree[p].count[++temp]=num;
38 }
39 void DFS(node p,char *s,int len,int cur){
40       if(cur==len){
41          if(p.num){
42             for(int i=1;i<=p.num;i++)
43             ans[++top]=p.count[i];
44          }
45         while(p.next[27]>0&&tree[p.next[27]].num==0)
46             p=tree[p.next[27]];
47          if(p.next[27]>0&&tree[p.next[27]].num>0){
48                 int tt=tree[p.next[27]].num;
49          for(int i=1;i<=tt;i++)
50             ans[++top]=tree[p.next[27]].count[i];
51          }
52            return ;
53       }
54       int t=s[cur]-‘a‘;
55       if(p.next[t]>0)
56          DFS(tree[p.next[t]],s,len,cur+1);
57       if(p.next[26]>0)
58         DFS(tree[p.next[26]],s,len,cur+1);
59       if(p.next[27]>0){
60           int temp=cur;
61           while(temp<=len){
62             DFS(tree[p.next[27]],s,len,temp);
63             temp++;
64           }
65       }
66 }
67 char str[100002];
68 int main(){
69   while(~scanf("%d%d",&n,&m)){
70          init(tree[0],-1);
71     for(int i=1;i<=n;i++){
72         scanf("%s",str);
73         insert(str,i-1);
74     }
75     for(int i=1;i<=m;i++){
76         scanf("%s",str);
77         top=0;
78         DFS(tree[0],str,strlen(str),0);
79         sort(ans+1,ans+top+1);
80         int tt=unique(ans+1,ans+top+1)-ans-1;
81         if(tt>0){
82         for(int i=1;i<tt;i++)
83             printf("%d ",ans[i]);
84         printf("%d\n",ans[tt]);
85         }
86         else
87             printf("Not match\n");
88     }
89   }
90 }

时间: 2024-10-09 22:01:45

Wild Words的相关文章

POJ 3340 &amp; HDU 2410 Barbara Bennett&#39;s Wild Numbers(数学)

题目链接: PKU:http://poj.org/problem?id=3340 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2410 Description A wild number is a string containing digits and question marks (like 36?1?8). A number X matches a wild number W if they have the same length, and

【POJ】1816 Wild Words

DFS+字典树.题目数据很BT.注意控制DFS深度小于等于len.当'\0'时,还需判断末尾*.另外,当遇到*时,注意讨论情况. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <algorithm> 7 using namespace std; 8 9

HDU 2410 Barbara Bennett&#39;s Wild Numbers (想法题)

题目链接:HDU 2410 Barbara Bennett's Wild Numbers 题意:给出两串数w,s(长度相同),第一串中有"?",问"?"取的值使w对应的数大于s对应的数 的最大方案数. 思路:W,S一一对应比较: 遇到第一个'?'之前比较情况 1.w[i]<s[i] 方案数0种:break: 2.w[i]>s[i] break.之后有n个''?' 方案数就有10的n次方种. 3.w[i]=s[i] 继续比较,重复1.2两个条件. 遇到'?

UVA 475 - Wild Thing(KMP)

UVA 475 - Wild Thing 题目链接 题意:给定一个带通配符的文件名作为格式,后面跟一个文件名,要求输出符合格式的文件名 思路:先把带通配符的文件名根据星号位置进行分解,然后对于每个文件名去判断,判断的方法用KMP,如果格式的每段都能在文件名中不断往后一一匹配上,那么就是可以的,注意考虑开头和结尾没有星号的情况,还有这题就是如果找不到一个合适的,就什么都不输出,包括换行 代码: #include <cstdio> #include <cstring> #include

Dangling pointer(悬垂指针、迷途指针)和 Wild pointer(野指针)

一.迷途指针(悬垂指针) 在计算机编程领域中,迷途指针与野指针指的是不指向任何合法的对象的指针. 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称迷途指针(悬垂指针).若操作系统将这部分已经释放的内存重新分配给另外一个进程,而原来的程序重新引用现在的迷途指针,则将产生无法预料的后果.因为此时迷途指针所指向的内存现在包含的已经完全是不同的数据.通常来说,若原来的程序继续往迷途指针所指向的内存地址写入数据,这些和原来程序不相关的数

深度学习论文笔记--Recover Canonical-View Faces in the Wild with Deep Neural Network

文章来源:CVPR2014 作者:Zhenyao Zhu,Ping Luo,Xiaogang Wang,Xiaoou Tang (香港中文大学果然牛啊,CVPR一刷一大堆) 主要内容: 提出了利用深度学习(还是CNN)来进行人脸图像重构正面人脸,然后利用重构的正面人脸图像来进行人脸的verification,当然能够取得更高的准确率(比没有用正脸去verification),文章提出利用DL来学习从任意脸到canonical 脸的转换,可以认为是一个回归问题(也不一定非得用DL方法来做). 现有

HDU 2410 Barbara Bennett&amp;#39;s Wild Numbers (想法题)

题目链接:HDU 2410 Barbara Bennett's Wild Numbers 题意:给出两串数w,s(长度同样),第一串中有"?",问"?"取的值使w相应的数大于s相应的数 的最慷慨案数. 思路:W,S一一相应比較: 遇到第一个'?'之前比較情况 1.w[i]<s[i] 方案数0种:break: 2.w[i]>s[i] break. 之后有n个''?' 方案数就有10的n次方种. 3.w[i]=s[i] 继续比較.反复1.2两个条件. 遇到'

【论文笔记】Recursive Recurrent Nets with Attention Modeling for OCR in the Wild

写在前面: 我看的paper大多为Computer Vision.Deep Learning相关的paper,现在基本也处于入门阶段,一些理解可能不太正确.说到底,小女子才疏学浅,如果有错误及理解不透彻的地方,欢迎各位大神批评指正! E-mail:[email protected]. <Recursive Recurrent Nets with Attention Modeling for OCR in the Wild>已经被CVPR 2016(CV领域三大顶会之一)正式接收了,主要是介绍了

poj 3340 Barbara Bennett&#39;s Wild Numbers(数位DP)

Barbara Bennett's Wild Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3153   Accepted: 1143 Description A wild number is a string containing digits and question marks (like 36?1?8). A number X matches a wild number W if they hav

【SIGGRAPH 2015】【巫师3 狂猎 The Witcher 3: Wild Hunt 】顶级的开放世界游戏的实现技术。

[SIGGRAPH 2015][巫师3 狂猎 The Witcher 3: Wild Hunt ]顶级的开放世界游戏的实现技术 作者:西川善司 日文链接  http://www.4gamer.net/games/202/G020288/20150811091/ 计算机图形和交互技术的学术大会[SIGGRAPH 2015],在北美时间的8月9日到13日召开了. SIGGRAPH 2015的会场,因E3而被熟知的洛杉矶会议中心 SIGGRAPH有着美国洛杉矶和以外地区交替举办的惯例,2014年是在加