题目大意就是帮你给N条字符串,每条长度不超过20。问要将他们单一识别出来,每个字符串最短可以缩为多短。

如:

abc

abcdefg

bc

adef

这四个字符串就可分别缩写为

abc

abcd

b

ad

方法:   字典树(可以参阅http://s.acmore.net/show_article/show/58)。

另外我还用了一个bool数组last用来记录每个单一识别的字符串最短可以到哪个位置,他的下标就是字典树中每个字母对应的序号

方法如下:(以上面的为例)

当输入的字符串在某一个位置开始与之前的不同,就记录这个不同的字母(设置为true),之后的不再改变

当输入字符串的某位置在建好的树中时,把last加长(设置为true)

第一次输入:abc          last[0]=true;

第二次输入:abcdefg    last[0]=last[1]=last[2]=last[3]=true;

第三次输入:bc            last[0]=true;

第四次输入:adef         last[0]=last[1]=true;

这样一来输出端长度就分别为1、4、1、2

代码实现如下:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <stack>
#include <set>
#include <queue>
#define MAX(a,b) (a) > (b)? (a):(b)
#define MIN(a,b) (a) < (b)? (a):(b)
#define mem(a) memset(a,0,sizeof(a))
#define INF 1000000007
#define MAXN 20005
using namespace std; int trie[MAXN][],val[MAXN],S;
bool last[MAXN];
char ma[][]; int get_num(char ch){return ch-'a';} void init()
{
mem(trie);mem(val);
mem(last);mem(ma);
S = ;
} void insert(char *s)
{
int u=,len = strlen(s);
int flag = ;
for(int i=;i<len;i++)
{
int c = get_num(s[i]);
if(!trie[u][c])
{
trie[u][c] = S;
val[u] = ;
if(flag)//如果与上面的字符串开始不一样,酒吧第一个开始不一样的位置设置为true
{
last[u]=true;
flag = ;//之后的依然是false
}
u = S;
S++;
}
else if(val[u] == )
{
u = trie[u][c];
last[u] = true;//在查找中发现与已建好的树里面相同的数,那么需要识别的字符串就要相应的加长
}
}
if(val[u]== || val[u] == )return;
else val[u] = ;
} int main()
{
init();
int T =;
while(scanf("%s",ma[T])!=EOF)
{
insert(ma[T++]);
}
for(int i=;i<T;i++)
{
printf("%s ",ma[i]);
int u=,j=;
while(last[u] && ma[i][j])
{
printf("%c",ma[i][j]);
u = trie[u][get_num(ma[i][j++])];
}
printf("\n");
}
return ;
}

POJ2001Shortest Prefixes(字典树)的更多相关文章

  1. POJ 2001 Shortest Prefixes(字典树)

    题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...

  2. poj2001 Shortest Prefixes(字典树)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21642   Accepted: 926 ...

  3. poj 2001 Shortest Prefixes(字典树trie 动态分配内存)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15610   Accepted: 673 ...

  4. poj 2001 Shortest Prefixes(字典树)

    题目链接:http://poj.org/problem?id=2001 思路分析: 在Trie结点中添加数据域childNum,表示以该字符串为前缀的字符数目: 在创建结点时,路径上的所有除叶子节点以 ...

  5. poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12731   Accepted: 544 ...

  6. POJ 2001 Shortest Prefixes 【 trie树(别名字典树)】

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15574   Accepted: 671 ...

  7. BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...

  8. 字典树---2001 POJ Shortest Prefixes(找最短前缀)

    做的第一道字典树的题,算比较水的: -->>>:传送门 代码: #include <stdio.h> #include<stdlib.h> #define M ...

  9. POJ2001Shortest Prefixes[Trie]

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17683   Accepted: 768 ...

随机推荐

  1. Python3 学习第一弹:基本数据类型

    本人学习主要从<python基础教程第二版>,<dive into python3>等书籍,及一些网上大牛的博客中学习特别是Python官方文档<Python Tutor ...

  2. bzoj1486: [HNOI2009]最小圈

    二分+dfs. 这道题求图的最小环的每条边的权值的平均值μ. 这个平均值是大有用处的,求它我们就不用记录这条环到底有几条边构成. 如果我们把这个图的所有边的权值减去μ,就会出现负环. 所以二分求解. ...

  3. Web Api 返回参数,实现统一标准化!

    string camelCaseObj = JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.None, new JsonSer ...

  4. The resource could not be loaded because the App Transport

    Xcode7 beta 网络请求报错:The resource could not be loaded because the App Transport Xcode7 beta 网络请求报错:The ...

  5. zoj 1119 /poj 1523 SPF

    题目描述:考虑图8.9中的两个网络,假定网络中的数据只在有线路直接连接的2个结点之间以点对点的方式传输.一个结点出现故障,比如图(a)所示的网络中结点3出现故障,将会阻止其他某些结点之间的通信.结点1 ...

  6. <六>面向对象分析之UML核心元素之业务实体

    一:基本概念

  7. 常见MyEclipse报错—— serialVersionUID的作用

    先挖好坑 http://swiftlet.net/archives/1268

  8. IOS AFNetworking简介及使用

    转:http://www.it165.net/pro/html/201405/13099.html 一AFNetworking简介AFNetworking是一个在IOS开发中使用非常多网络开源库,适用 ...

  9. linux 下 NetBeans 字体大小设置

    在linux mint 12下安装了 NetBeans7.1.2使用之后,觉得字体不好看,字体普遍特别大,分三个方面改NetBeans的字体. 1. 代码字体大小 点击NetBeans菜单,工具--& ...

  10. equals(),hashcode()方法详解

    Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用. equals ...