https://vjudge.net/problem/POJ-2945

题意:

给出n个长度相同的DNA序列,如果一个DNA序列出现过两次,那么就有说明它被复制了一次。问被复制0次,1次,2次……n-1次的DNA序列分别有多少个。

思路:

可以利用字典树的方法做,用map目测会超时。因为一个字符串是它自己本身的假前缀,所以把每一个字符串的前缀数量-1,就是它被复制的数目。这题学到了一个技巧,统计的时候,已经统计过的要跳开,一开始用map判断超时了,之后想到用sort对char类型的字符串进行排序,但是sort是不能对char的字符串进行排序。但是,我们有结构体啊,把字符串封装在一个结构体中,自己写一个cmp函数就完美的解决了这个问题。这题还是字典树模板用上啦。一定记住最后要释放内存啊。QAQ

代码:

 #include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; int a[]; const int maxn = ; struct str
{
char s[];
}b[]; bool cmp(str aa,str bb)
{
return strcmp(aa.s,bb.s) < ;
} struct trie
{
trie *next[maxn]; int flag; trie()
{
flag = ;
memset(next,NULL,sizeof(next));
}
}*root; void insert(char *str)
{
int len = strlen(str);
trie *p = root,*q; for (int i = ;i < len;i++)
{
int id = str[i] - 'A'; if (p -> next[id] == NULL)
{
q = new trie();
p -> next[id] = q;
p = p -> next[id];
}
else
{
p = p->next[id]; ++(p->flag);
}
}
} int query(char *str)
{
int len = strlen(str);
trie *p = root; for (int i = ;i < len;i++)
{
int id = str[i] - 'A'; p = p -> next[id]; if (p == NULL) return ;
} return p->flag;
} void Free(trie* t)
{
if (t == NULL) return; for (int i = ;i < maxn;i++)
{
if (t -> next[i]) Free(t->next[i]);
} delete(t);
} int main()
{
int n,m; while (scanf("%d%d",&n,&m) != EOF)
{
if (m == && n == ) break; memset(a,,sizeof(a)); root = new trie(); for (int i = ;i < n;i++)
{
scanf("%s",b[i].s);
insert(b[i].s);
} sort(b,b+n,cmp); //for (int i = 0;i < n;i++)
//printf("%s\n",b[i].s); int rs = query(b[].s); char ss[];strcpy(ss,b[].s); a[rs-]++; for (int i = ;i < n;i++)
{
if (strcmp(ss,b[i].s) == ) continue; strcpy(ss,b[i].s); rs = query(b[i].s); a[rs-]++;
} for (int i = ;i < n;i++)
{
printf("%d\n",a[i]);
} Free(root);
} return ;
}

poj 2945 Find the Clones的更多相关文章

  1. POJ 2945 trie树

    Find the Clones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7704 Accepted: 2879 Descr ...

  2. poj 2945 trie树统计字符串出现次数

    用记录附加信息的val数组记录次数即可. trie的原理:每个可能出现的字目给一个编号c,那么整个树就是一个c叉树 ch[u][c]表示 节点u走c边过去之后的节点 PS:trie树还有种动态写法,使 ...

  3. 字典树trie的学习与练习题

    博客详解: http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html http://eriol.iteye.com/bl ...

  4. Find the Clones(字典树)

    链接:http://poj.org/problem?id=2945 Description Doubleville, a small town in Texas, was attacked by th ...

  5. POJ2945:Find the Clones——题解

    http://poj.org/problem?id=2945 还是trie树……对于结束标记累加并且开个数组记录一下即可. #include<cstdio> #include<cst ...

  6. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  7. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  8. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  9. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

随机推荐

  1. node 自动重启 nodemon

    最近在玩node,可是每次修改完js,总要重启下服务,还要杀掉端口,感觉可麻烦了,最近发现nodemon这个东西很好,直接解决了我的烦恼. npm install -g nodemon 以后直接启动n ...

  2. 20165226 学习基础和C语言基础调查

    心得体会 驱动迭代 学习是一个老师与学生互动的过程,二者关系又恰如健身教练与学员,在进行基础知识的培训后还需借助工具加强相关方面的训练.学习提升的过程离不开学生在实践中发现问题并在老师的帮助下解决问题 ...

  3. 17.C++-string字符串类(详解)

    C++字符串string类 在C语言里,字符串是用字符数组来表示的,而对于应用层而言,会经常用到字符串,而继续使用字符数组,就使得效率非常低. 所以在C++标准库里,通过类string从新自定义了字符 ...

  4. 笔记:Spring Cloud Eureka 服务治理

    Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...

  5. vuex的学习笔记

    什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性. ...

  6. mysql授权报错

    mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '<zabbix>';ERROR ...

  7. Ubuntu16.0.4的磁盘管理

    ubuntu下硬盘无损分区移动修改工具 原创 2014年04月13日 :: ubuntu上面其实有很好的分区调整工具,gparted,非常好使用 安装非常简单 sudo apt-get install ...

  8. 随机四则运算的出题程序java

    一.设计思想 1.功能较多必须有菜单选择项,将一个大程序分为若干个功能模块的小程序,逐个实现2.针对题目避免重复时先将已生成的算式保存,然后将下一条生成的式子进行判断是否已生成,如果生成则返回循环语句 ...

  9. Beta冲刺 第四天

    Beta冲刺 第四天 1. 昨天的困难 1.网页使用了一些网上现成的模板,其主要是使用像素做处理的,所以检查起来比较费事费力. 2.使用github代码merge时出现了问题.所以花费了不少的时间在人 ...

  10. C语言-第一次作业

    题目6-1 计算两数的和与差 1.设计思路 (1)主要描述题目算法 第一步:看主函数知道程序输入浮点型变量a,b,通过函数计算输出和与差. 第二步:函数部分将a赋值op1,b赋值op2,&su ...