-
-
小明得到了一张写有奇怪字符串的纸,他想知道一些字符串出现了多少次,但这些字符串太多了,他想找你帮忙,你能帮他吗?输入字符包括所有小写字母、‘@’、‘+’。
-
输入
-
第一行包含一个整数T(T<=100).表示测试数据组数。
接下来每组数据第一行包含两个整数n,m(n,m<100000),分别表示有n个字符串,小明要问你m次。
接下来n行,每行包含一个字符串,长度不大于15。
接下来m行,每行包含一个字符串,表示小明要问该串出现的次数。
输出
- 输出每组小明询问数串出现的次数。 样例输入
-
15 3helloit@is+so@easyhelloibelieveicanachellohelloicannotacitGiveup
样例输出
-
300
来源
- NYIST第一届校赛(非专业组) 上传者
- ACM_丁国强
- 题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=685
-
第一行包含一个整数T(T<=100).表示测试数据组数。
查找字符串
时间限制: 1000 ms | 内存限制: 65535 KB难度: 3-
描述
无删除操作和有删除操作释放空间的差距,如图:1364为代码一所占的空间,308为代码二所占的空间
代码一:无删除操作
#include<iostream> #include<cstring> #include<cstdio> using namespace std; typedef struct TrieNode{ int data; TrieNode *next[28]; TrieNode(){ data=0; memset(next,0,sizeof(next)); } }T; TrieNode *root=NULL; //声明一个根节点 void Build(char *c) //建字典树 { int i,v,l=strlen(c); TrieNode *p=root; TrieNode *q=NULL; for(i=0;i<l;i++){ if(c[i]=='+')v=26; else if(c[i]=='@')v=27; else v=c[i]-'a'; if(p->next[v]==NULL){ q=new TrieNode; p->next[v]=q; } p=p->next[v]; p->data++; } } int Find(char *c) { int i,v,l=strlen(c); TrieNode *p=root; for(i=0;i<l;i++) { if(c[i]=='+')v=26; else if(c[i]=='@')v=27; else v=c[i]-'a'; if(p->next[v]==NULL){ return 0;break; } else p=p->next[v]; } return p->data; } int main() { int T; int n,m; char str[15]; scanf("%d",&T); while(T--) { root=new TrieNode; scanf("%d %d",&n,&m); while(n--) { scanf("%s",str); Build(str); } while(m--) { scanf("%s",str); printf("%d\n",Find(str)); } } return 0; }
代码二:有删除操作
#include<iostream> #include<cstring> #include<cstdio> using namespace std; typedef struct TrieNode{ int data; TrieNode *next[28]; TrieNode(){ data=0; memset(next,0,sizeof(next)); } }T; TrieNode *root=NULL; //声明一个根节点 void Build(char *c) //建字典树 { int i,v,l=strlen(c); TrieNode *p=root; TrieNode *q=NULL; for(i=0;i<l;i++){ if(c[i]=='+')v=26; else if(c[i]=='@')v=27; else v=c[i]-'a'; if(p->next[v]==NULL){ q=new TrieNode; p->next[v]=q; } p=p->next[v]; p->data++; } } int Find(char *c) { int i,v,l=strlen(c); TrieNode *p=root; for(i=0;i<l;i++) { if(c[i]=='+')v=26; else if(c[i]=='@')v=27; else v=c[i]-'a'; if(p->next[v]==NULL){ return 0;break; } else p=p->next[v]; } return p->data; } void Delate(TrieNode *root) { for(int i=0;i<28;i++) if(root->next[i]) Delate(root->next[i]); delete(root); } int main() { int T; int n,m; char str[15]; scanf("%d",&T); while(T--) { root=new TrieNode; scanf("%d %d",&n,&m); while(n--) { scanf("%s",str); Build(str); } while(m--) { scanf("%s",str); printf("%d\n",Find(str)); } Delate(root); } return 0; }
-
nyoj 685查找字符串
最新推荐文章于 2018-06-28 20:40:10 发布