noi4_6_1799[最短前缀]

字典树。数据不大,代码不短……

type knot=record
           sum:longint;
           son:array[0..30] of longint;
           ch:char;
          end;

var tree:array[1..30000] of knot;
    st:array[1..1000] of string[20];
    n,tot:longint;

procedure insert(k,len:longint);
var i:longint;
begin
 inc(tree[k].sum);
 if len>length(st[n]) then exit;
 for i:=1 to tree[k].son[0] do
  if tree[tree[k].son[i]].ch=st[n][len] then
   begin
    insert(tree[k].son[i],len+1);
    exit;
   end;
 inc(tree[k].son[0]);
 inc(tot);
 tree[k].son[tree[k].son[0]]:=tot;
 tree[tot].sum:=0;
 tree[tot].ch:=st[n][len];
 tree[tot].son[0]:=0;
 insert(tot,len+1);
end;

procedure find(sn,k,len:longint);
var i:longint;
begin
 if k<>1 then write(tree[k].ch);
 if len>length(st[sn]) then exit;
 if tree[k].sum=1 then
   exit;
 for i:=1 to tree[k].son[0] do
  if tree[tree[k].son[i]].ch=st[sn][len] then
   find(sn,tree[k].son[i],len+1);
end;

procedure prepare;
begin
 tree[1].son[0]:=0;
 tree[1].ch:=‘ ‘;
 tree[1].sum:=0;
end;

procedure scanf;
begin
 n:=0;
 tot:=1;
 while not eoln do
  begin
   inc(n);
   readln(st[n]);
   insert(1,1);
  end;
end;

procedure printf;
var i:longint;
begin
 for i:=1 to n do
  begin
   write(st[i],‘ ‘);
   find(i,1,1);
   writeln;
  end;
end;

begin
 prepare;
 scanf;
 printf;
end.
时间: 2024-12-16 04:52:23

noi4_6_1799[最短前缀]的相关文章

NOI题库1799 最短前缀

1799:最短前缀 总时间限制: 1000ms 内存限制: 65536kB 描述 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon".注意到这里我们不认为空串是字串, 但是每个非空串是它自身的字串. 我们现在希望能用前缀来缩略的表示单词.例

百练OJ:2797最短前缀

刚开始找输入的退出方式死也没找着,原来这并不是个问题,上网看了一下有人直接这么写的 while( scanf( "%s", input[ temp ++]) != EOF ):输入完成后 通过输入一行Ctrl+Z再回车退出就行了,有人说用字典树,我不熟悉,直接暴力求解的,就是对于每一个输入的单词,从短到长把他的子串弄出来,依次判断是不是其他单词的子串,如果都不是,那就可以退出循环了:如果是,那证明这时的子串还不能代表本身,还要再长一些.用到的关键两个函数是strstr,判断是否是子串,

1799:最短前缀

题目链接:http://noi.openjudge.cn/ch0406/1799/ 总时间限制:1000ms内存限制:65536kB 描述 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon".注意到这里我们不认为空串是字串, 但是每个非空串

【OpenJ_Bailian - 2797】最短前缀

最短前缀 Descriptions: 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon".注意到这里我们不认为空串是字串, 但是每个非空串是它自身的字串. 我们现在希望能用前缀来缩略的表示单词.例如, "carbohydrate&

最短前缀

Shortest Prefixes Description A prefix of a string is a substring starting at the beginning of the given string. The prefixes of "carbon" are: "c", "ca", "car", "carb", "carbo", and "carbon&

14. Longest Common Prefix (最长公共前缀)

一.Description: Write a function to find the longest common prefix string amongst an array of strings. public class Solution { public String longestCommonPrefix(String[] strs) { } } 二.Solutions: 1.思路: 开始想的是数组中每两个相邻字符串进行比较,并取比较的最短的前缀作为整个数组的最短前缀.时间复杂度为

贪心:字典树openjudge1799-最短前缀

描述 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon".注意到这里我们不认为空串是字串, 但是每个非空串是它自身的字串. 我们现在希望能用前缀来缩略的表示单词.例如, "carbohydrate" 通常用"c

【数据结构】字典树/Trie树/前缀树 - 字符串的统计、排序和保存

字典树 描述 字典树,又称单词查找树.Trie树.前缀树,是一种树形结构,是一种哈希树的变种. 典型应用是用于统计.排序和保存大量的字符串(但不仅限于字符串). 常见操作有插入和查找,删除操作少见. 性质 根节点不包含字符 除根节点外每一个节点都只包含一个字符 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串 每个节点的所有子节点包含的字符都不相同 优点 利用字符串的公共前缀来减少查询时间 最大限度地减少无谓的字符串比较 查询效率比哈希树高 自带字典序排序 直接判断重复,或者记

知识点整理--组合数学

定义 组合:C(n,m)表示从n个元素中,取任意的m个元素的方案数. 定义式:    递推式:C(n,m)=C(n-1,m-1)+C(n-1,m) 排列:A(n,m)表示从n个元素中,取任意的m个元素并排列好的方案数 常用公式 1. C(n,m)=C(n,n-m) 2. ∑C(n,i)=2^n 证明:从n个元素中任意取i个(0<=i<=n)的所有不同方案. 首先,∑C(n,i)表示从n个元素中任意取0个的所有不同取法+从n个元素中任意取1个的所有不同取法+从n个元素中任意取2个的所有不同取法+