用链式字典树解决POJ2945
2024-09-05 08:35:27
首先,我们的思路是用链式的字典树结构,解决poj2945这道题
题意是,统计所有的字符串出现的次数,并依次输出各个次数的数量
例如:
input
9 6
AAAAAA
ACACAC
GTTTTG
ACACAC
GTTTTG
ACACAC
ACACAC
TCCCCC
TCCCCC
out
1
2
0
1
0
0
0
0
0
遇到的一些小麻烦 : 之前提交poj爆内存了,就试了一下这个代码,结果还是爆内存,后来发现,我这里不能设置位 Node *next[26],不然铁定爆内存,于是我认真审题,发现这里设置为4就好啦因为只有4个字符需要入树,至于怎么判断下标,我们用一个fun()函数来解决就好了。
具体的思路就是 : 先用find()判断,是否在树里有该个DNA,如果有让,count[i]--,i++,;count[i]++, 如果没有,用T_insert插入,并给count[1]置为1;
最后输出for(i::n)printf("%d\n",count[i]);就可以了。
#include <iostream>
#include <cstdio>
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstring>
using namespace std; struct Node
{
Node *next[];
char val;
int count;
Node(char val)
{
this->val =val;
count=;
memset(next,NULL,sizeof(next));
}
}; Node *root =new Node('\0');
int *count;
//int *count;
int fun(char s)
{
switch(s)
{
case 'A':return ;break;
case 'C':return ;break;
case 'G':return ;break;
case 'T':return ;break;
}
}
bool T_Find(char *s)
{
int len=strlen(s);
Node *p=root;
for(int i=;i<len;i++)
{ int pos=fun(s[i]);
if(p->next[pos]==NULL)
return false;
p=p->next[pos];
}
count[p->count]--; //如果 程序运行到最后,出现过两次了,那么 p->count 出现过一次的 count[p->count] -- ,也就是给出现一次的次数减一
p->count++; //然后给 p->count 置为出现过2 次
count[p->count]++;
return true;
} void T_insert(char *s)
{
int len=strlen(s);
Node *p=root;
for(int i=;i<len;i++)
{
int pos=fun(s[i]);
if(p->next[pos]==NULL)
{
p->next[pos]= new Node(s[i]);
}
p=p->next[pos];
}
p->count=;
count[p->count]++;
} /*
9 6
AAAAAA
ACACAC
GTTTTG
ACACAC
GTTTTG
ACACAC
ACACAC
TCCCCC
TCCCCC
0 0
*/ int main()
{ int n,m;
while(scanf("%d%d",&n,&m)==&&n&&m)
{
count =new int [n+];
fill(count,count+n+,);
for(int i=;i<n;i++)
{
char *s;
s= new char[m+];
scanf("%s",s);
if(T_Find(s)==false)
{
T_insert(s);
}
}
int i=;
for( i=;i<=n;i++)
{
printf("%d\n",count[i]);
} }
return ;
}
最新文章
- jQuery 之 Callback 实现
- linux设备驱动归纳总结(四):3.抢占和上下文切换【转】
- css杂记
- Python计算文件MD5值
- Excle快速输入√与&#215;
- csu 1303 Decimal (数论题)
- cygwin远程操作linux
- hadoop之wordCount程序理解
- android studio上代码编译调试中遇到的一些异常记录
- 14.2.3 InnoDB Redo Log
- 【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用
- 如何通过Mock API提高APP开发效率?
- 第一个简单的maven项目
- [MySQL] timestamp和datetime的区别和大坑
- spring cloud实战与思考(三) 微服务之间通过fiegn上传一组文件(下)
- SpringBoot之普通类获取Spring容器中的bean
- IDEA解决crtl+space与搜狗输入法冲突
- Django 自定义模板语法
- Android开发导出apk报错:Unable to build: the file dx.jar was not loaded from the SDK folder
- iOS Runtime 实操练习