IME HDU-4287-Intelligent
Http://acm.hdu.edu.cn/showproblem.php? Pid = 1, 4287
Start to use dictionary tree + deep search, timeout .... Later, we found that the question can contain a maximum of six digits. We can convert the string into a corresponding number, and then hash it.
TLE code
# Include <iostream> # include <cstdio> # include <cstring> # include <cstdlib> using namespace std; int n, m, ans; char map [5005] [8]; char word [8]; char phone [8] [4] = {0, 1, 2}, {3, 4}, {6, 7, 8}, {9, 10, 11 }, {, 14}, {15, 16, 17,18}, {, 21}, {, 24, 25}; int num [8] = {3, 3, 3, 3, 3, 4, 3, 4}; struct node {int count; node * childs [26]; node () {count = 0; for (int I = 0; I <26; I ++) childs [I] = NULL ;}}; node * root; node * current, * n Ewnode; void insert (char * str) // insert string {int I, m; current = root; for (I = 0; I <strlen (str); I ++) {m = str [I]-'A'; if (current-> childs [m]! = NULL) current = current-> childs [m]; else {newnode = new node; current-> childs [m] = newnode; current = newnode ;}} current-> count = 1;} int search (char * str) // In the dictionary tree, find whether a word exists {int I, m; current = root; for (I = 0; I <strlen (str); I ++) {m = str [I]-'A '; if (current-> childs [m] = NULL) return 0; current = current-> childs [m];} return current-> count ;} void del (node * head) {int I; for (I = 0; I <26; I ++) if (head-> childs [I]! = NULL) del (head-> childs [I]); delete (head);} void dfs (char str [10], int len, int t) {int I, s; if (t = len) {word [len] = '\ 0'; if (search (word) ans ++ ;} s = num [str [t]-'2']; for (I = 0; I <s; I ++) {word [t] = phone [str [t]-'2'] [I] + 'a'; dfs (str, len, t + 1 );}} int main () {int t, I; int len; char temp [8]; scanf ("% d", & t); while (t --) {scanf ("% d", & n, & m); for (I = 0; I <n; I ++) scanf ("% s ", map [I]); root = new node; while (m --) {scanf ("% s", temp); insert (temp) ;}for (I = 0; I <n; I ++) {ans = 0; len = strlen (map [I]); dfs (map [I], len, 0 ); printf ("% d \ n", ans);} del (root);} return 0 ;}
AC code
#include<stdio.h>#include<string.h>#include<stdlib.h>int hashh[1000005];int a[5005];char str[10];int judge(char c){if('a'<=c&&c<='c')return 2;else if('d'<=c&&c<='f')return 3;else if('g'<=c&&c<='i')return 4;else if('j'<=c&&c<='l')return 5;else if('m'<=c&&c<='o')return 6;else if('p'<=c&&c<='s')return 7;else if('t'<=c&&c<='v')return 8;else if('w'<=c&&c<='z')return 9;}int main(){int t;int i,j,n,m,len,sum;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(i=0;i<n;i++)scanf("%d",&a[i]);memset(hashh,0,sizeof(hashh)); for(i=1;i<=m;i++){ scanf("%s",str);len=strlen(str);sum=0;for(j=0;j<len;j++)sum=sum*10+judge(str[j]);hashh[sum]++;}for(i=0;i<n;i++)printf("%d\n",hashh[a[i]]);}return 0;}