UVa 11732 - strcmp() Anyone?
2015-09-19 17:49
253 查看
称号:给你一些话,给你一个字符串比较函数,所有的话都当奇偶校验,什么是比较次数。
分析:弦、特里。
首先。看数据大小,假设正常的发现线索,会议TLE和MLE。
由于,常规的字典树深度为1000,并且有可能会有大量的指正空间浪费。
所以,採用树的压缩算法(左兄弟,右孩子)。能够提高执行效率。
然后。在字典树上同级就可以。统计时,能够先建树再统计,或者边建树边统计。
这里我选用边建树边统计的方法(网上大量的做法,都是先建树再统计的,搜索求解)
每次插入单词时。它仅仅与前面插入的单词比較;单词的比較次数为当中每一个字母的比較次数的和。
单词中每一个字母的比較次数。就是这个字母的根节点包括的单词个数。
单词比較函数例如以下:
1.同样长度为L的两个单词比較代价为2L-1。出最后一次外要进行s结束的推断;
2.单词的比較长度应该为strlen(str)+1,结束符也是比較的一环;
3.假设两个单词同样,则多计算一次结束推断。比較次数+1。
注意:使用LL,否则数据会溢出。
分析:弦、特里。
首先。看数据大小,假设正常的发现线索,会议TLE和MLE。
由于,常规的字典树深度为1000,并且有可能会有大量的指正空间浪费。
所以,採用树的压缩算法(左兄弟,右孩子)。能够提高执行效率。
然后。在字典树上同级就可以。统计时,能够先建树再统计,或者边建树边统计。
这里我选用边建树边统计的方法(网上大量的做法,都是先建树再统计的,搜索求解)
每次插入单词时。它仅仅与前面插入的单词比較;单词的比較次数为当中每一个字母的比較次数的和。
单词中每一个字母的比較次数。就是这个字母的根节点包括的单词个数。
单词比較函数例如以下:
int strcmp(char *s, char *t) { int i; for (i=0; s[i]==t[i]; i++) if (s[i]=='\0') return 0; return s[i] - t[i]; }由于比較函数如上,计算时要注意下面几点:
1.同样长度为L的两个单词比較代价为2L-1。出最后一次外要进行s结束的推断;
2.单词的比較长度应该为strlen(str)+1,结束符也是比較的一环;
3.假设两个单词同样,则多计算一次结束推断。比較次数+1。
注意:使用LL,否则数据会溢出。
#include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; typedef long long LL; char words[1010]; /* Trie define */ #define nodesize 4444444 //节点个数 typedef struct node1 { char value; int size; int count; node1* Lchild; node1* Rchild; }tnode; tnode dict[nodesize]; class Trie { private: LL count; int size; tnode* root; public: Trie() {initial();} void initial() { memset( dict, 0, sizeof(dict) ); size=0;count=0LL;root=newnode(0); } tnode* newnode( char c ) { dict[size].value = c; return &dict[size ++]; } void insert( char* word, int L ) { tnode* now = root->Rchild,*save = root; int same = 1; for ( int i = 0 ; i <= L ; ++ i ) { if ( !now ) { save->Rchild = newnode(word[i]); now = save->Rchild; now->count = 1; same = 0; }else { if ( i ) count += now->count; count += now->count ++; while ( now->Lchild && now->value != word[i] ) now = now->Lchild; if ( now->value != word[i] ) { now->Lchild = newnode(word[i]); now = now->Lchild; same = 0; } } save = now; now = save->Rchild; } if ( same ) save->size ++; count += save->size; } LL query() {return count;} }trie; /* Trie end */ int main() { int Case = 1,N; while ( scanf("%d",&N) != EOF ) { if ( !N ) break; trie.initial(); for ( int i = 0 ; i < N ; ++ i ) { scanf("%s",words); trie.insert(words,strlen(words)); } printf("Case %d: %lld\n",Case ++,trie.query()); } return 0; }
相关文章推荐
- 改变unity场景的图片比例保存到xml当中
- hdu 2161 Primes
- 数组名和指针的区别
- 01机房可行性研究报告
- win8.1-进入测试模式-调试模式
- 1018:Communication System
- 【日常学习】【倍增LCA】codevs2370 小机房的树题解
- ubuntu安装deb文件时,缺少的依赖的下载网址
- 计应143 卞玉新
- expdp 备份数据库-附带报错信息
- js关闭浏览器窗口及检查浏览器关闭事件
- python的numpy、scipy、pandas、matplotlib、pip库下载
- springMVC工作原理
- 3.3 difflib--比较不同序列之间差异库
- LBS JAVA Spring mongoDB
- FlatBuffers小试
- 3.3 difflib--比较不同序列之间差异库
- Odoo(OpenERP)应用实践: 使用db-filter参数实现通过域名指定访问哪个数据库
- 第一次写博客
- 移动端重置浏览器默认样式代码