【bzoj1819】[JSOI]Word Query电子字典 trie+暴力
2015-11-25 19:03
447 查看
先建出trie树,暴力在trie树上dfs,三种情况分别对应字符串跳一下,trie树上跳一次,trie树上往不同方向跳一次,注意记录一下每个节点是否出现过,因为可能有同一个字符串经过不同的操作多次到达的情况。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #define maxn 200010 using namespace std; int ch[maxn][26]; bool tag[maxn]; char s[maxn]; int q[maxn]; bool vis[maxn]; int ans,n,m,tot,len,top; bool w; void insert() { int len=strlen(s),x=0; for (int i=0;i<len;i++) { if (ch[x][s[i]-'a']==-1) ch[x][s[i]-'a']=++tot; x=ch[x][s[i]-'a']; } tag[x]=1; } void dfs(int x,int y,int f) { if (x==len && tag[y] && !f) {w=1;return;} if (x==len && tag[y] && f) {if (!vis[y]) ans++,q[++top]=y,vis[y]=1;return;} if (x<len && !f) dfs(x+1,y,1); if (!f) { for (int i=0;i<26;i++) if (ch[y][i]!=-1) {dfs(x,ch[y][i],1);if (i!=s[x+1]-'a') dfs(x+1,ch[y][i],1);} } if (x==len) return; if (ch[y][s[x+1]-'a']!=-1) dfs(x+1,ch[y][s[x+1]-'a'],f); } int main() { scanf("%d%d",&n,&m); for (int i=0;i<=200000;i++) for (int j=0;j<26;j++) ch[i][j]=-1; for (int i=1;i<=n;i++) { scanf("%s",s); insert(); } for (int i=1;i<=m;i++) { ans=0;w=0; while (top) vis[q[top--]]=0; scanf("%s",s+1); len=strlen(s+1); dfs(0,0,0); if (w) printf("-1\n"); else printf("%d\n",ans); } return 0; }
相关文章推荐
- UI第十二天:通讯录实战
- LightOJ 1048 - Conquering Keokradong(二分)
- 自定义UIButton
- Request.Item和Request.Params
- hdu5568 sequence2(dp+大数)
- BIOS锁定纯UEFI启动的解锁办法
- StringBuilder与StringBuffer的区别(转) &精简版StringBuilder,提速字符串拼接
- UIWindow & UIWindowLevel详解
- 设计模式(五)创建者模式(Builder)
- UIColor (16进制颜色、透明色使用)
- KVC setvalue:forkey与setvalue:forkeypath的区别
- UIPickerView两列依附关系
- String & StringBuffer & StringBuilder
- 给easyui的datebox控件添加清空按钮
- UIPickerVeiw多列的控制
- UITextField 设置placeholder的颜色
- Range Sum Query - Mutable -leetcode
- 软件GUI测试中的关注点
- UIPickerView 的用法
- 实现UITableView上View的上拉隐藏下拉出现效果(2)