HDU 6096 String (字典树, 2017 Multi-Univ Training Contest 6)
来源:互联网 发布:数据库信息如何填写 编辑:程序博客网 时间:2024/05/22 06:43
Problem
有 N 组单词
Idea
利用字典树解决。将前缀与后缀拼接形成
枚举每个单词,查找单词在字典树上能有多少的匹配情况。具体为:优先匹配 拼接符
,则倒置
Code
#include<bits/stdc++.h>using namespace std;const int N = 500000 + 10;int T, n, Q, st[N], len[N], pot[N], ans[N];char s[N], pre[N], suf[N], combin[N];const int Node_max = 1000000 + 5;struct Node{ int next[30], flag;} Trie[Node_max];int Tsize;int Trie_insert(char str[], int st, int len, int idx){ int tmp = 0; for(int i=st;i<st+len;i++) { if(!Trie[tmp].next[str[i] - 'a']) { Trie[tmp].next[str[i] - 'a'] = ++Tsize; } tmp = Trie[tmp].next[str[i]-'a']; } if(Trie[tmp].flag == 0) Trie[tmp].flag = idx; return Trie[tmp].flag;}void Trie_query_suf(int it, int st, int en) { for(int i=en;i>=st;i--) { if(Trie[it].next[s[i] - 'a'] == 0) return; it = Trie[it].next[ s[i] - 'a' ]; if(Trie[it].flag) ans[ Trie[it].flag ]++; }}void Trie_query_pre(int it, int st, int en) { for(int i=st;i<=en;i++) { if(Trie[it].next[26]) Trie_query_suf(Trie[it].next[26], i, en); if(Trie[it].next[ s[i] - 'a' ] == 0) return; it = Trie[it].next[ s[i] - 'a' ]; }}int main(){ scanf("%d", &T); while(T-- && scanf("%d %d", &n, &Q)!=EOF) { memset(Trie, 0, sizeof(Trie)); memset(ans, 0, sizeof(ans)); Tsize = 0; int ip = 0; for(int i=1;i<=n;i++) { scanf(" %s", s+ip); st[i] = ip; len[i] = strlen(s+ip); ip += len[i]; } for(int i=1;i<=Q;i++) { scanf(" %s %s", pre, suf); int qlen = 0; for(;pre[ qlen ];qlen++) combin[qlen] = pre[qlen]; combin[qlen++] = char('z'+1); for(int j=strlen(suf)-1;j>=0;j--) combin[qlen++] = suf[j]; combin[qlen] = '\0'; pot[i] = Trie_insert(combin, 0, qlen, i); } for(int i=1;i<=n;i++) { Trie_query_pre(0, st[i], st[i]+len[i]-1); } for(int i=1;i<=Q;i++) { if(pot[i] != i) ans[i] = ans[ pot[i] ]; printf("%d\n", ans[i]); } }}
阅读全文
0 0
- HDU 6096 String (字典树, 2017 Multi-Univ Training Contest 6)
- HDU 6059 Kanade's trio (字典树, 2017 Multi-Univ Training Contest 3)
- HDU 6138 Fleet of the Eternal Throne (后缀数组+字典树, 2017 Multi-Univ Training Contest 8)
- HDU 6086 Rikka with String (AC 自动机+状压 dp, 2017 Multi-Univ Training Contest 5)
- HDU 6070 Dirt Ratio (二分+线段树, 2017 Multi-Univ Training Contest 4)
- HDU 6058 Kanade's sum (链表, 2017 Multi-Univ Training Contest 3)
- HDU 6065 RXD, tree and sequence (LCA, 2017 Multi-Univ Training Contest 3)
- HDU 6071 Lazy Running (Dijstra, 2017 Multi-Univ Training Contest 4)
- HDU 6078 Wavel Sequence (dp + 树状数组, 2017 Multi-Univ Training Contest 4)
- HDU 6069 Counting Divisors (2017 Multi-Univ Training Contest 4)
- HDU 6073 Matching In Multiplication (拓扑+DFS, 2017 Multi-Univ Training Contest 4)
- HDU 6046 hash (HASH, 2017 Multi-Univ Training Contest 2)
- HDU 6074 Phone Call (LCA+并查集, 2017 Multi-Univ Training Contest 4)
- HDU 6076 Security Check (DP, 2017 Multi-Univ Training Contest 4)
- HDU 6085 Rikka with Candies (bitset, 2017 Multi-Univ Training Contest 5)
- HDU 6090 Rikka with Graph (贪心+构造, 2017 Multi-Univ Training Contest 5)
- HDU 6072 Logical Chain (Biset+Kosaraju, 2017 Multi-Univ Training Contest 4)
- HDU 6093 Rikka with Number (2017 Multi-Univ Training Contest 5)
- poj1364(91/600)
- 欧拉函数知识点及其求法模板
- android studio 降低编译版本出错
- 数字增益和模拟增益
- 在linux上使用yum安装JDK
- HDU 6096 String (字典树, 2017 Multi-Univ Training Contest 6)
- ListView设置逐条加载动画,第一条总是不断重复
- JVM学习笔记-01-Java及Jvm发展历史
- osg Nofity使用
- 51Nod1005 大数加法(C语言)
- Java 修改jdk不起作用
- android 字体颜色随机
- hdu5922Minimum’s Revenge
- opencv 图像的载入显示和输出