}edge[maxn];inthead[maxn],cnt=0,cnt1=1;voidadd(intu,charc){ cnt++;cnt1++; edge[cnt].se=c; edge[cnt].to=cnt1; edge[cnt].nxt=head[u]; head[u]=cnt;return; }voidinsert(intk){intu=1;intl=strlen(s);for(inti=0;i<l;i++){intv=-1;charc=s[i];for(intj=head[u];j;...
首先我们可以按照模式串来建立一棵trie树,不过这样的话空间限制是一个问题。解决的方法是把trie树像建图一样用链式前向星去存储,这样的话就节省了很多空间(具体怎么实现可以看代码,还是很简单的)。之后我们把这棵trie树建好,之后就得开始搜了……其实普通的点和?都很可以,不过遇到*号的话,我们就要枚举长度去向下...
POJ1816 Wild Words 刚开始我以为要用模板串建trie树,发现m只有100,而n有100000,所以应该用带符号的串建树。 然后模板串的长度很小,所以在trie树上dfs即可。 这道题串可能有重,比如有一个t?k和t?k,应该输出2和3。而且因为*可以是空字符,所以,对于每一个询问的答案也应该去重。 1#include<cstdio>2#includ...
也作为一种转移, 对于每个询问串, 暴力dfs就可以了. 代码实现: View Code 1#include <cstdio> 2#include <cstdlib> 3#include <cstring> 4#include <vector> 5#include <algorithm> 6usingnamespacestd; 7 8constintMAX_N =100000, MAX_M =100, P_LEN =6, W_LEN =20; 9intn, m; 10charp[P_...
链接: http://poj.org/problem?id=1816 题意: 先给你n个字符串,这些字符串包含小写字母,‘?’和‘*’,其中 ‘?’可以表示任意一个字符,‘*’可以表示任意长度的任意字符,包括0个 然后m次询问,每次给你一个字符串,问你它和哪些字符串匹配 题解: 5月第一发AC真不容易啊... 查看原文 Python字符串——...
hdu1816 + POJ 2723开锁(二分+2sat) 题意: 有m层门,我们在最外层,我们要一层一层的进,每一层上有两把锁,我们只要开启其中的一把们就会开,我们有n组钥匙,每组两把,我们只能用其中的一把,用完后第二把瞬间就会消失,问你最多能开到多少层们。
POJ1816 Wild Words 嘟嘟嘟 刚开始我以为要用模板串建trie树,发现m只有100,而n有100000,所以应该用带符号的串建树。 然后模板串的长度很小,所以在trie树上dfs即可。 这道题串可能有重,比如有一个t?k和t?k,应该输出2和3。而且因为*可以是空字符,所以,对于每一个询问的答案也应该去重。
{ b=0;for(intj=head[now];j;j=edge[j].next)if(edge[j].to==s[i]) b=1,now=j;if(!b)add(now,s[i]),now=head[now]; } edge[now].v.push_back(x); edge[now].is=1; }voidcheck(intnow,intpos){if(pos==l+1) {if(edge[now].is) ...
HDU 1816, POJ 2723 Get Luffy Out 题目链接 题意:N串钥匙。每串2把,仅仅能选一把。然后有n个大门,每一个门有两个锁,开了一个就能通过,问选一些钥匙,最多能通过多少个门 思路:二分通过个数。然后对于钥匙建边至少一个不选,门建边至少一个选,然后2-sat搞一下就可以。
【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>7usingnamespacestd;89#defineTRIEN 281011...