用记录附加信息的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树统计字符串出现次数的更多相关文章

  1. POJ 2945 trie树

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

  2. 利用Trie树对字符串集合进行排序并计算特征值

    该算法用于将一组乱序的字符串反序列化到一个Trie树中,这个过程即可视为对字符串进行了一次排序. 还可以通过调用 GetFeatureString 将该 Trie 树重新序列化. #include & ...

  3. sql统计字符串出现次数技巧

    在牛客网上看到一道题,感觉挺有趣,是用sql统计字符串出现的次数. 这里提供一种思路,比如统计字符串A中子串B的出现次数: SELECT (LENGTH(A) - LENGTH(REPLACE(A, ...

  4. POJ 3630 trie树

    Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26559 Accepted: 8000 Descripti ...

  5. POJ 2513 trie树+并查集判断无向图的欧拉路

    生无可恋 查RE查了一个多小时.. 原因是我N define的是250500 应该是500500!!!!!!!!! 身败名裂,已无颜面对众人.. 吐槽完了 我们来说思路... 思路: 判有向图能否形成 ...

  6. Vim统计字符串出现次数

    关键命令: :%s/pattern//gn 参数说明: % - 指明操作区间,%表示全文本:可以使用1,$或者行区间代替 s – substitute,表示替换 pattern - 要查找的字符串 / ...

  7. Trie树统计单词前缀

    输入 输入的第一行为一个正整数n.表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦).单词由不超过10个的小写英文字母组成,可能存在同样的单词.此时应将其视作不同的单 ...

  8. Trie树检索字符串

    #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TrieNode ...

  9. hdu 1671&& poj 3630 (trie 树应用)

    Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25280   Accepted: 7678 Descr ...

随机推荐

  1. Cordova - 使用Cordova开发iOS应用实战2(生命周期、使用Safari调试)

    Cordova - 使用Cordova开发iOS应用实战2(生命周期.使用Safari调试) 前文我们创建了一个简单的Cordova项目,结构如下: 1,Cordova生命周期事件 (1)device ...

  2. 洛谷 1016 / codevs 1046 旅行家的预算

    https://www.luogu.org/problem/show?pid=1016 http://codevs.cn/problem/1046/ 题目描述 Description 一个旅行家想驾驶 ...

  3. C#并行编程中的Parallel.Invoke

    一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过程中一般会将很多任务划分成若干个互相独立子任务, ...

  4. 一个C++宏定义与枚举定义重复的编译错误

    C++的开发效率低是众所周知的,原因比如有: 语言复杂度高 编译效率低 工具链不够完整高效(尤其是linux下) 另外一个恐怕是不少编译错误让人摸不着头脑,今天碰到一个,举个例子: #include ...

  5. 异常和IO

    异常 异常是指java程序运行时(非编译)所发生的非正常情况或错误. Java对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类为 java.lang.Throwable, ...

  6. Jump Game 的三种思路 - leetcode 55. Jump Game

    Jump Game 是一道有意思的题目.题意很简单,给你一个数组,数组的每个元素表示你能前进的最大步数,最开始时你在第一个元素所在的位置,之后你可以前进,问能不能到达最后一个元素位置. 比如: A = ...

  7. 从零开始,将ASP.NET Core部署到Linux生产环境

    研究.NET Core已经一段时间了,一直都是在Windows上开发,这2天尝试着将公司一个很简单的内部Web项目改造成了ASP.NET Core,并且部署到Linux上.生产环境如下: Linux ...

  8. Tensorflow学习笔记2:About Session, Graph, Operation and Tensor

    简介 上一篇笔记:Tensorflow学习笔记1:Get Started 我们谈到Tensorflow是基于图(Graph)的计算系统.而图的节点则是由操作(Operation)来构成的,而图的各个节 ...

  9. 个人觉得目前 最好用的Taobao API的NodeJS封装

    话说,Top API SDK默认只给了四种语言的SDK,没有我大NodeJS,这可怎么行,于是封装了一个. 参考地址 GitHub: https://github.com/xiaoppp/TopAPI ...

  10. WEB 文件上传

    关键:<input name="file" type="file"/> 然后,在外面<form>层中必须写上:enctype=" ...