标签:
分析:此题题意很简单,我就不说了,第一想到的就是用字典树做,首先你得考虑用哪个作为字典树,显然,这里用后面的字符串作为树更好。
接着就是套模板了。此题WA了无数次,找bug找了一天,也没找到头绪,后来看别人的结题报告,才明白,原来坑爹的把memset(mark)放在了循环外面,一直以为只循环一次就够了,,真是坑爹啊,,,
做到现在了,感觉字典树的问题基本上都能用map来解决。
代码一:字典树
学会了用内联,确实会快一些
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; int cnt; int haash[151]; int res[5005]; const int MAX = 500000; int a[]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9,9}; struct trie { trie *next[26]; int v; // 数组编号 int vv; // 末尾的标志 void init() { vv = 1; v=-1; memset(next,NULL,sizeof(next)); } }heap[MAX]; inline trie *new_trie() { heap[cnt].init(); return &heap[cnt++]; } inline void creat(char *s,trie *p,int num) { for(;*s;s++) { int id = *s - '0'; if(p->next[id] == NULL) { p->next[id] = new_trie(); } p = p->next[id]; } p->v = num; p->vv = -1; } inline void find(char *s,trie *p) { for(;*s;s++) { p = p->next[a[*s-'a']]; if(p == NULL) return ; } if(p->vv == -1) { res[p->v]++; } else return ; } int main() { int k,i,m,n,j; char s[10]; cnt = 0; trie *root = new_trie(); cin>>m; while(m--) { cin>>k>>n; getchar(); for(i=0;i<k;i++) { gets(s); creat(s,root,i); } memset(res,0,sizeof(res)); while(n--) { gets(s); find(s,root); } for(i=0;i<k;i++) { cout<<res[i]<<endl; } } return 0; }
#include <iostream> #include <cstring> #include <cstdlib> #include <map> using namespace std; int haash[151]; int mark[5001]; int a[]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9}; int main() { int k,i,m,n,j,num,sum; char s[10]; map<int,int> mp; scanf("%d",&m); while(m--) { scanf("%d%d",&k,&n); for(i=1;i<=k;i++) { scanf("%d",&num); mp[num] = i; } memset(mark,0,sizeof(mark)); while(n--) { scanf("%s",s); for(i=0,sum=0;s[i];i++) { sum = sum*10 + a[s[i]-'a']; } mark[mp[sum]]++; } for(i=1;i<=k;i++) { printf("%d\n",mark[i]); } } return 0; }
#include <iostream> #include <cstring> #include <cstdlib> #include <map> using namespace std; int haash[151]; int mark[5001]; int a[]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9}; int main() { int k,i,m,n,j,num[5001],sum; char s[10]; map<int,int> mp; scanf("%d",&m); while(m--) { scanf("%d%d",&k,&n); memset(num,0,sizeof(num)); for(i=1;i<=k;i++) { scanf("%d",&num[i]); } memset(mark,0,sizeof(mark)); while(n--) { scanf("%s",s); for(i=0,sum=0;s[i];i++) { sum = sum*10 + a[s[i]-'a']; } for(i=1;i<=k;i++) { if(sum == num[i]) mark[i]++; } } for(i=1;i<=k;i++) { printf("%d\n",mark[i]); } } return 0; }
1 3 5 46 64448 74 go in night might gn
3 2 0
HDU 4287 Intelligent IME (字典树 && map)
标签:
原文地址:http://blog.csdn.net/xinwen1995/article/details/46446461