思路:
AC了很爽。一开始看题的时候把要求的东西给搞反了,是用字母去找相应的数字出现次数。
只要用数字构建个Trie树,然后将每次输入进来的字母字符串给转换成数字,然后search一下就可以。
其中要注意end和id的灵活运用
AC代码:
#include <iostream> #include <cstring> using namespace std; struct node { int e,id; struct node* next[10]; }; node* root = new node(); char hashs[150]; char str[5007][10]; int ans[5007]; void init() { hashs[\'a\']=hashs[\'b\']=hashs[\'c\']=\'2\'; hashs[\'d\']=hashs[\'e\']=hashs[\'f\']=\'3\'; hashs[\'g\']=hashs[\'h\']=hashs[\'i\']=\'4\'; hashs[\'j\']=hashs[\'k\']=hashs[\'l\']=\'5\'; hashs[\'m\']=hashs[\'n\']=hashs[\'o\']=\'6\'; hashs[\'p\']=hashs[\'q\']=hashs[\'r\']=hashs[\'s\']=\'7\'; hashs[\'t\']=hashs[\'u\']=hashs[\'v\']=\'8\'; hashs[\'w\']=hashs[\'x\']=hashs[\'y\']=hashs[\'z\']=\'9\'; } void insert(char* s,int mark) { node* p = root; for(;*s!=\'\0\';s++) { int n = *s-\'0\'; if(p->next[n] == NULL) p->next[n] = new node(); p = p->next[n]; } p->e = 1; p->id = mark; } void search(char* s) { node* p = root; for(;*s!=\'\0\';s++) { int n = *s-\'0\'; if(p->next[n] == NULL) return ; p = p->next[n]; } if(p->e == 1) ans[p->id]++; } int main() { int i,j,k; init(); int T; cin>>T; while(T--) { memset(ans,0,sizeof(ans)); int n,m; cin>>n>>m; for(i = 0;i < n;i++) { cin>>str[i]; insert(str[i],i); } char tmp[10]; for(j = 1;j <= m;j++) { cin>>tmp; for(k = 0;k < strlen(tmp);k++) tmp[k] = hashs[tmp[k]]; search(tmp); } for(i = 0;i < n;i++) cout<<ans[i]<<endl; } return 0; }