hdu-统计难题
来源:互联网 发布:数据采集卡的使用 编辑:程序博客网 时间:2024/06/06 07:16
http://acm.hdu.edu.cn/showproblem.php?pid=1251
Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
bananabandbeeabsoluteacmbabbandabc
Sample Output
2310
真心不会啊,真的感觉太难啦,这是别人的代码
一比较好的模板:
#define MAX 26typedef struct Trie{ Trie *next[MAX];//地址域 int v;//数据域};Trie *root;void createTrie(char *str){ int len=strlen(str); Trie *p=root,*q; for(int i=0; i<len; ++i) { int id=str[i]-'0'; if(p->next[id] == NULL) { q=(Trie *)malloc(sizeof(Trie)); q->v = 1; //初始v==1 for(int j=0; j<MAX; ++j) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else { p->next[id]->v++; p = p->next[id]; } } p->v = -1; //若为结尾,则将v改成-1表示}int findTrie(char *str){ int len = strlen(str); Trie *p = root; for(int i=0; i<len; ++i) { int id = str[i]-'0'; p = p->next[id]; if(p == NULL) //若为空集,表示不存以此为前缀的串 return 0; if(p->v == -1) //字符集中已有串是此串的前缀 return -1; } return -1; //此串是字符集中某串的前缀}int dealTrie(Trie* T){ int i; if(T==NULL) return 0; for(i=0; i<MAX; i++) { if(T->next[i]!=NULL) deal(T->next[i]); } free(T); return 0;}
代码:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;char a[11];struct node{ int n; struct node*a[26]; node() { n=1; for(int i=0;i<26;i++) a[i]=0; }};node*root;void insert(string&s){ int i; node*current=root; for(i=0;i<s.size();i++) { if(current->a[s[i]-'a']!=0) { current=current->a[s[i]-'a']; current->n++; } else { node*code= new node(); current->a[s[i]-'a']=code; current=code; } }}int find(string&s){ int i; node*current=root; for(i=0;i<s.size();i++) { if(current->a[s[i]-'a']!=0) { current=current->a[s[i]-'a']; } else return 0; } return current->n;}int main(){ int i,j,k; root=new node(); string s; int flag=1; while(cin.getline(a,11)) { s=a; if(s!="") { if(flag) insert(s); else printf("%d\n",find(s)); } else { flag=0; } } return 0;}
另:
#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;struct Trie{ int v; Trie *next[26];};Trie root;void createTrie(char *str){ int len=strlen(str); Trie *p=&root,*q; for(int i=0;i<len;i++) { int id=str[i]-'a'; if(p->next[id]==NULL) { q=(Trie *)malloc(sizeof(root)); q->v=1; for(int j=0;j<26;j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else { p->next[id]->v++; p=p->next[id]; } }}int findTrie(char *str){ int len=strlen(str); Trie *p=&root; for(int i=0;i<len;i++) { int id=str[i]-'a'; p=p->next[id]; if(p==NULL) { return 0; } } return p->v;}int main(){ char str[15]; for(int i=0;i<26;i++) { root.next[i]=NULL; } while(gets(str)&&str[0]!='\0') { createTrie(str); } while(cin>>str) { int ans=findTrie(str); cout<<ans<<endl; } return 0;}
- HDU 1251 统计难题
- HDU 1251 统计难题
- hdu 1251 统计难题
- HDU 1251:统计难题
- HDU 1251 统计难题
- Hdu-1251 统计难题
- hdu 1251 统计难题
- hdu 1251 统计难题
- hdu 1251 统计难题
- HDU-1251-统计难题
- HDU 1251 统计难题
- hdu 1251统计难题
- hdu 1251统计难题
- hdu 1251 统计难题
- HDU 1251 统计难题
- hdu 统计难题
- hdu 1251统计难题
- HDU 1251 统计难题
- 马上着手开发 iOS 应用程序 (Start Developing iOS Apps Today)——框架
- 关于黄路对他人进行恶意诋毁!人身攻击!威胁的说明!
- 总结 JSP与 servlet之间的传值
- 数组
- OSPF身份验证
- hdu-统计难题
- android_系统结构4层
- 马上着手开发 iOS 应用程序 (Start Developing iOS Apps Today)——设计模式
- svn客户机安装
- ZOJ 2507 Anti-SG
- LeetCode-Binary Tree Maximum Path Sum
- 马上着手开发 iOS 应用程序 (Start Developing iOS Apps Today)——用户界面设计
- id3算法(python代码)
- ubuntu 13.04 开启工作空间