poj 2945 trie树统计字符串出现次数
用记录附加信息的val数组记录次数即可。
trie的原理:每个可能出现的字目给一个编号c,那么整个树就是一个c叉树
ch[u][c]表示 节点u走c边过去之后的节点
PS:trie树还有种动态写法,使用指针和动态分配内存代替了连续的ch数组,更加节省内存。
Reference:http://blog.csdn.net/architect19/article/details/8966247
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxnode 400010
#define sigma_size 22 char a[maxnode][sigma_size];
int t[maxnode];
int n,m;
//struct Trie
//{
int ch[maxnode][sigma_size]; //ch[i][j]:记录结点i的那个编号为j的子节点
int val[maxnode]; //val[i]:i节点的附加信息,
//若val[i]=0不是还没到单词结束。否则val[i]为该单词的出现次数
int sz;
void Trie()
{
sz=;
memset(ch,,sizeof(ch));
memset(val,,sizeof(val));
memset(t,,sizeof(t));
}
int idx(char c) //idx(c)即字符c的编号。
{
//A G C T
if (c=='A') return ;
if (c=='G') return ;
if (c=='C') return ;
if (c=='T') return ;
//return c-'A'; //第一个字符是A
}
void Insert(char s[sigma_size],int v)
{
int u=,n=strlen(s);
for (int i=;i<n;i++)
{
int c=idx(s[i]);
if (!ch[u][c])
{
memset(ch[sz],,sizeof(ch[sz]));
val[sz]=;
ch[u][c]=sz++;
}
u=ch[u][c];
}
//val[u]=v;
val[u]+=v;
}
int Query(char s[sigma_size]) //times of s
{
int u=,c;
int tm=strlen(s);
for (int i=;i<tm;i++)
{
//c=s[i]-'A';
c=idx(s[i]);
if (!ch[u][c]) return ;
u=ch[u][c];
//if (val[u]==1) return true; //若此时s还没走完但trie树上已经走到结尾了,即树上单词是s的前缀
}
return val[u];
}
//}; int main()
{
//freopen("in.txt","r",stdin);
//ios::sync_with_stdio(false); //while (cin>>n>>m)
while(~scanf("%d%d",&n,&m))
{
Trie();
if ((n!=)&&(m!=))
{
for (int i=;i<=n;i++)
{
//cin>>a[i];
scanf("%s",a[i]);
Insert(a[i],);
}
for (int i=;i<=n;i++)
{
int tm=Query(a[i]);
t[tm]++;
}
for (int i=;i<=n;i++)
printf("%d\n",t[i]/i);
//cout<<endl;
}
else break;
} return ;
}
poj 2945 trie树统计字符串出现次数的更多相关文章
- POJ 2945 trie树
Find the Clones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7704 Accepted: 2879 Descr ...
- 利用Trie树对字符串集合进行排序并计算特征值
该算法用于将一组乱序的字符串反序列化到一个Trie树中,这个过程即可视为对字符串进行了一次排序. 还可以通过调用 GetFeatureString 将该 Trie 树重新序列化. #include & ...
- sql统计字符串出现次数技巧
在牛客网上看到一道题,感觉挺有趣,是用sql统计字符串出现的次数. 这里提供一种思路,比如统计字符串A中子串B的出现次数: SELECT (LENGTH(A) - LENGTH(REPLACE(A, ...
- POJ 3630 trie树
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26559 Accepted: 8000 Descripti ...
- POJ 2513 trie树+并查集判断无向图的欧拉路
生无可恋 查RE查了一个多小时.. 原因是我N define的是250500 应该是500500!!!!!!!!! 身败名裂,已无颜面对众人.. 吐槽完了 我们来说思路... 思路: 判有向图能否形成 ...
- Vim统计字符串出现次数
关键命令: :%s/pattern//gn 参数说明: % - 指明操作区间,%表示全文本:可以使用1,$或者行区间代替 s – substitute,表示替换 pattern - 要查找的字符串 / ...
- Trie树统计单词前缀
输入 输入的第一行为一个正整数n.表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦).单词由不超过10个的小写英文字母组成,可能存在同样的单词.此时应将其视作不同的单 ...
- Trie树检索字符串
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TrieNode ...
- hdu 1671&& poj 3630 (trie 树应用)
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 25280 Accepted: 7678 Descr ...
随机推荐
- 设置apache https服务
配置http.conf,所在位置d:\wamp\bin\apache\apache2.4.9\conf\http.conf LoadModule socache_shmcb_module modu ...
- SQL使用开窗函数与CTE查询每月销售额的前几名
WITH tagTab AS( SELECT YearMonth, pm=RANK() OVER(PARTITION BY YearMonth ORDER BY amount DESC) FROM S ...
- .NET:Entity Framework 笔记
有二年没关注EF,今天无意试了下发现跟主流的Hibernate等ORM框架越来越接近了,先看下Entity类的定义: using System; using System.Collections.Ge ...
- 想请问下PDF双面打印时(打印机自动双面打印)为什么反面那页的内容是倒过来的,应该怎么设置?
用foxit reader 打印pdf 直接设置为双面打印并且一张2页打印,发现正反面刚好倒着来的,其实说的正反面倒着是从左右翻的角度来讲的,如果上下翻会发现刚好是这个顺序的,这个是要在双面打印设置里 ...
- Webwork 学习之路【01】Webwork与 Struct 的前世今生
Struts 1是全世界第一个发布的MVC框架,它由Craig McClanahan在2001年发布,该框架一经推出,就得到了世界上Java Web开发者的拥护,经过长达6年时间的锤炼,Struts ...
- 整合Apache与PHP教程
Apache下载安装完成后,PHP下载解压后,最重要的是如何将他们连接起来,就是整合到一起,让它们之间有联系,笔者根据自己多次配的经验和帮学弟学妹配时他们的理解程度整理了一个比较详细易理解的版本,下面 ...
- 深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构
引言 各位猿友们好,计算机系统系列很久没更新了,实在是抱歉之极.新的一年,为了给计算机系统系列添加一些新的元素,LZ将其更改为书的原名<深入理解计算机系统>.这本书非常厚,而且难度较高,L ...
- Bootstrap系列 -- 5. 文本对齐方式
一. 文本对齐样式 .text-left:左对齐 .text-center:居中对齐 .text-right:右对齐 .text-justify:两端对齐 二. 使用方式 <p class=&q ...
- C++学习准则
C++学习准则 1.把C++当成一门新的语言学习(和C没啥关系!真的): 2.看<Thinking In C++>,不要看<C++变成死相>(C++编程思想,翻译的非常差): ...
- 遇到技嘉 Gigabyte UEFI DualBIOS问题
我的板子是技嘉H87-D3H二手板子,用了差不多三年左右,一直感觉不错,承担着高强度的开发任务. 问题描述: 无法开机,按下电源后,主板通电状态灯亮,CPU和显卡风扇转动,显示器显示下图: 2至3秒后 ...