好吧,今天一天都跟这个题杠上了,一直超内存,总结下来就是一句话,在大数据量的情况下,一个memset就很占内存。
字典树
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
遇到单词不认识怎么办? 查字典啊,已知字典中有n个单词,假设单词都是由小写字母组成。现有m个不认识的单词,询问这m个单词是否出现在字典中。
Input
含有多组测试用例。
第一行输入n,m (n>=0&&n<=100000&&m>=0&&m<=100000)分别是字典中存在的n个单词和要查询的m个单词.
紧跟着n行,代表字典中存在的单词。
然后m行,要查询的m个单词
n=0&&m=0 程序结束
数据保证所有的单词都是有小写字母组成,并且长度不超过10
Output
若存在则输出Yes,不存在输出No .
Example Input
3 2 aab aa ad ac ad 0 0
Example Output
No Yes 第一个是同学的 第二个是我的#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define maxn 1000010 using namespace std; int root; int a[maxn][26]; char s[22]; bool vis[maxn]; int cnt; void create(int root,char *s) { int len=strlen(s),t,i; for(i=0;i<len;i++) { t=s[i]-'a'; if(a[root][t]==0) { a[root][t] = cnt++; } root=a[root][t]; } vis[root]=1; } int find(int root,char *s) { int len=strlen(s),t,i; for(i=0;i<len;i++) { t=s[i]-'a'; if(a[root][t]==0) return 0; else root=a[root][t]; } if(vis[root])return true; return false; } int main() { int n,m,ans,q; while(~scanf("%d %d",&n,&m) && n && m) { memset(vis, 0, sizeof(vis)); for(int i=0; i<=cnt; i++)memset(a[i], 0, sizeof(a[i])); cnt=0; while(n--) { q=0; scanf("%s",s); create(q,s); } while(m--) { scanf("%s",s); root=0; ans=find(root,s); // printf("%d\n",ans); if(!ans) printf("No\n"); else printf("Yes\n"); } } return 0; #include <stdio.h> #include <stdlib.h> #include <string.h> int b[1000000][26],num; bool c[1000000]; int search(char * a,int I,int len,int J) { int flag=1,n; n=a[I++]-'a'; if(b[J][n]==0) { flag=0; return flag; } J=b[J][n]; if(I<=len-1) { flag=search(a,I,len,J); return flag; } else { if(c[J]==0) { flag=0; } return flag; } } void create(char *a,int I,int len,int J) { int n; n=a[I++]-'a'; if(b[J][n]==0) { b[J][n]=++num; } J=b[J][n]; if(I<=len-1) { create(a,I,len,J); } else { c[J]=1; } } int main() { int n,m,i,flag,len; char a[20]; while(~scanf("%d %d",&n,&m)&&n&&m) { for(i=0;i<=num;i++){memset(b[i],0,sizeof(b[i]));} num=0; memset(c,0,sizeof(c)); for(i=0;i<=n-1;i++) { scanf("%s",a); len=strlen(a); create(a,0,len,0); } for(i=0;i<=m-1;i++) { scanf("%s",a); len=strlen(a); flag=search(a,0,len,0); if(flag) { printf("Yes\n"); } else { printf("No\n"); } } } return 0; }