首页 > 其他 > 详细

HDU 4287 Intelligent IME

时间:2016-04-30 22:20:44      阅读:272      评论:0      收藏:0      [点我收藏+]

 

 在我没用hash之前,一直TLE,字符串处理时间过长,用了hash之后一直CE,(请看下图)我自从经历我的字典树G++MLE,C++AC以后,一直天真的用C++,后来的CE就是因为这个,G++才支持这个hash...

技术分享

#include<cstdio>
#include<iostream> #include
<string.h> int hash[128]; struct TrieNode { int no; TrieNode *next[10]; } node[30005]; TrieNode *root = &node[0]; int cnt,result[5005]; char word[10],s[10]; void init() { hash[a]=hash[b]=hash[c]=2; hash[d]=hash[e]=hash[f]=3;
hash[
g]=hash[h]=hash[i]=4; hash[j]=hash[k]=hash[l]=5; hash[m]=hash[n]=hash[o]=6; hash[p]=hash[q]=hash[r]=hash[s]=7; hash[t]=hash[u]=hash[v]=8; hash[w]=hash[x]=hash[y]=hash[z]=9; } void initRoot()
{
int i; for(i=0; i<10; i++) { root->next[i]=NULL; } } void insert(char str[],int num) { TrieNode *p = root; int len=strlen(str),i,j; for(i=0; i<len; i++)
{
if(p->next[str[i]-0]==NULL) { p->next[str[i]-0]=&node[cnt]; for(j=0; j<10; j++)node[cnt].next[j]=NULL; node[cnt].no=-1; cnt++; } p=p->next[str[i]-0]; } p->no=num; } /** 查询一个字母字符串对应的数字串 */ void query(char str[]) { int len=strlen(str),i; TrieNode *p=root; for(i=0; i<len; i++) {
p
=p->next[hash[str[i]]]; if(p==NULL)break; } if(p==NULL)return; else {
if(p->no!=-1)result[p->no]++; } } int main() { int t,m,n,i;
scanf(
"%d",&t); init();
while(t--) { cnt=1; initRoot(); memset(result,0,sizeof(result));
scanf(
"%d%d",&n,&m); for(i=0; i<n; i++) { scanf("%s",word); insert(word,i);
}
for(i=0; i<m; i++) { scanf("%s",s); query(s); } for(i=0; i<n; i++)
{ printf(
"%d\n",result[i]); } } return 0; }

 

 

技术分享

HDU 4287 Intelligent IME

原文:http://www.cnblogs.com/jifahu/p/5449449.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!