博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1816
阅读量:5290 次
发布时间:2019-06-14

本文共 2213 字,大约阅读时间需要 7 分钟。

题意:给出n个模式串,串中除开小写字母外,?代表一个字符,*代表可空的任意字符串,然后再给出m个字符串,问有多少个模式串可以与之匹配。

题解:通过模式串建立字典树,接着就是用字符串去dfs就行了,需要注意的就是遇到当前节点为*则还可以继续走当前结点,由于每次dfs要么字典树匹配深度加1,要么字符串位置加1,所以不会出现死循环。另外这题有些卡内存,模式串可能一样,记录每个结点代表哪些模式串时可以参照图论建边的方法,建一个邻接表储存各个结点的模式串信息。

View Code
1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 const int N=100005; 8 struct node 9 { 10 char ch; 11 int next[30]; 12 void init(char _ch) 13 { 14 ch=_ch; 15 memset(next,-1,sizeof(next)); 16 } 17 }tr[N*10]; 18 int cnt,head[N],nc; 19 bool mark[N]; 20 struct Edge 21 { 22 int to,next; 23 }edge[N*2]; 24 void add(int a,int b) 25 { 26 edge[nc].to=b;edge[nc].next=head[a];head[a]=nc++; 27 } 28 inline int change(char x) 29 { 30 if(x=='?') 31 return 26; 32 else if(x=='*') 33 return 27; 34 else 35 return x-'a'; 36 } 37 void insert(char s[],int id) 38 { 39 int i,p; 40 for(i=0,p=0;s[i]!='\0';i++) 41 { 42 int pt=change(s[i]); 43 if(tr[p].next[pt]==-1) 44 { 45 tr[p].next[pt]=cnt; 46 p=cnt++; 47 tr[p].init(s[i]); 48 } 49 else 50 p=tr[p].next[pt]; 51 } 52 add(p,id); 53 } 54 bool flag; 55 void dfs(char s[],int p) 56 { 57 if(s[0]=='\0') 58 { 59 for(int i=head[p];i!=-1;i=edge[i].next) 60 flag=mark[edge[i].to]=true; 61 if(tr[p].next[27]!=-1) 62 dfs(s,tr[p].next[27]); 63 return; 64 } 65 int pt=change(s[0]); 66 if(tr[p].next[pt]!=-1) 67 dfs(s+1,tr[p].next[pt]); 68 if(tr[p].next[26]!=-1) 69 dfs(s+1,tr[p].next[26]); 70 if(tr[p].next[27]!=-1) 71 dfs(s+1,tr[p].next[27]),dfs(s,tr[p].next[27]); 72 if(tr[p].ch=='*') 73 dfs(s+1,p); 74 } 75 int main() 76 { 77 int n,m; 78 while(scanf("%d%d",&n,&m)!=EOF) 79 { 80 tr[0].init('$'); 81 cnt=1; 82 memset(head,-1,sizeof(head)); 83 nc=0; 84 for(int i=0;i

转载于:https://www.cnblogs.com/tmeteorj/archive/2012/10/20/2732173.html

你可能感兴趣的文章
raft学习
查看>>
JavaScript之属性操作及小例子
查看>>
《Paxos Made Simple》翻译
查看>>
URL传递中文:Server.UrlEncode与Server.UrlDecode
查看>>
apache----log_format配置
查看>>
汇编语言基础知识摘要(《汇编语言》王爽)第 2 / 17 章
查看>>
Android基于IIS的APK下载(一)自定义更新控件
查看>>
ubuntu 11.04侧边栏怎么添加图标
查看>>
DotNetBar For Windows Forms 12.5.0.2 官方原版及注册
查看>>
修改Oracle 表空间名称 tablespace name
查看>>
12枚硬币问题
查看>>
Python+Django+Ansible Playbook自动化运维项目实战(二)
查看>>
www与m站间的转换
查看>>
mxnet(gluon) 实现DQN简单小例子
查看>>
像MIUI一样做Zabbix二次开发(7)——问答
查看>>
3.6节练习
查看>>
PRML-1.2.4 高斯分布
查看>>
lua
查看>>
Logstash 基础入门
查看>>
安装VS2012以后打开office 2007 的任何程序都跳出VS2012配置界面的解决方案
查看>>