【POJ2001】Shortest Prefixes

2023-11-07 19:09
文章标签 shortest poj2001 prefixes

本文主要是介绍【POJ2001】Shortest Prefixes,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:http://poj.org/problem?id=2001
题意:给出若干字符串,求每一个字符串的最短唯一表示前缀
题解
一看这种找前缀的东西肯定是trie
插入的时候每路过一个点,cnt++
查询的时候走到第一个cnt=1即可,如果没有,就输出这个串

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[1010][25];
int nxt[25010][26],cnt[25010];
int n,num=1;void insert(char *s)
{int len=strlen(s+1),t=1;for(int i=1;i<=len;i++){if(nxt[t][s[i]-'a']==0) nxt[t][s[i]-'a']=++num;cnt[nxt[t][s[i]-'a']]++;t=nxt[t][s[i]-'a'];}
}void search(int k,char *s)
{int len=strlen(s+1),t=1;for(int i=1;i<=len;i++){if(cnt[nxt[t][s[i]-'a']]==1){for(int j=1;j<=i;j++) printf("%c",str[k][j]);printf("\n");return;}t=nxt[t][s[i]-'a'];}printf("%s\n",str[k]+1);return;
}int main()
{
//  freopen("in.in","r",stdin);
//  freopen("out.out","w",stdout);while(~scanf("%s",str[++n]+1)) insert(str[n]);for(int i=1;i<=n;i++){printf("%s ",str[i]+1);search(i,str[i]);   }return 0;
}

这篇关于【POJ2001】Shortest Prefixes的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365684

相关文章

POJ2001字典树

给出n个单词,求出每个单词的非公共前缀,如果没有,则输出自己。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;

POJ 2001 Shortest Prefixes(字典树入门)

题目: http://poj.org/problem?id=2001 题意: 找到多个字符串中,各自唯一的最短子串,例如 carte 与 carce 各自唯一的最短子串为cart与carc,即不会与其它字符串的子串重复。 思路: 字典树 解题心得: 更新关键值的时机很重要 代码: #include<stdio.h>#include<string>typedef str

最短路径(Shortest Path)

单源最短路径问题 Dijkstra算法:基于递推的思想设计 未达顶点的最短路径一定是由已到达顶点的最短路径求出 所有顶点之间的最短路径,任意两个顶点之间的最短路径 Floyd算法:只是Dijkstra最短路径算法的加强,其本质还是递推

【HDU】2807 The Shortest Path 最短路

传送门:【HDU】2807 The Shortest Path 题目分析:题目很简单,矩阵计算出两个城市的连通性,建边,然后每次询问求最短路回答(或者floyd预处理)。 当然暴力的代价是惨痛的,用堆优化+dij+输入优化最多800ms。 然后很好奇前面的是怎么跑的这么快的,看了别人写的题解才发现,原来他们是用了hash的方法将二维化为一维了,虽然可能会错误,但在出题人不是故意去卡的情

【HDU】1595 find the longest of the shortest 枚举+最短路

传送门:【HDU】1595 find the longest of the shortest 题目分析:首先求出一条最短路,记录下最短路上用到的边,枚举删除每一条边,求一次最短路,求完后恢复删除的边。重复这一过程直到枚举完所有的边为止。所有删除边后求得的最短路里最长的那条就是答案。 代码如下: #include <cstdio>#include <cstring>

【HDU】4871 Shortest-path tree 最短路+点分治

传送门:【HDU】4871 Shortest-path tree 题目分析: 学了点分治后来看这道题,简直就是水题。。。 但是我竟然花了将近一个晚上才写出来。。。就因为一个地方写漏了T U T。。 首先根据题意求一棵树,最短路一下,然后最小字典序就按照编号顺序遍历邻接表给节点标记。 剩下的就是树分治的事了。 在以重心X为根的子树中,按照X的子节点v的子树中最长路径包含节点数升序遍

Shortest Distance to a Character

Given a string S and a character C, return an array of integers representing the shortest distance from the character C in the string. Example 1: Input: S = "loveleetcode", C = 'e'Output: [3, 2, 1,

[Python图论]在用图nx.shortest_path求解最短路径时,节点之间有多条边edge,会如何处理?

问: 在使用图求最短路径时,如果节点之间有多条路径,shortest_route = nx.shortest_path(G, source=start_node, target=end_node, weight='length')会如何处理,会自动选择最短那条吗? # 输出图G各节点之间有多少条边edge,并给出其长度Edges between 103928 and 25508583:共2条

hdu 2807 The Shortest Path(矩阵相乘+floyd)

http://acm.hdu.edu.cn/showproblem.php?pid=2807 大致题意:给出n个m*m的矩阵,若存在三个互异的矩阵满足a*b = c,那么a,c之间存在权值为1的单向边。有询问u,v,输出uv之间的最短距离。 #include <stdio.h>#include <iostream>#include <algorithm>#include <se

cf 432D.Prefixes and Suffixes KMP+dp

题意:求一个字符串有后缀与前缀相同的前缀在串中出现的次数。 分析:根据next数组可求出所有前缀在传中出现的次数,dp[next[i]]+=dp[i],dp[i]初始为1。也可以很简单得求出哪些前缀有相同的后缀。 #include<iostream>#include<string>#include<cstring>#include<cstdio>#include<cmath>#i