1819: [JSOI]Word Query电子字典

1819: [JSOI]Word Query电子字典

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 729  Solved: 238
[Submit][Status]

Description

人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间。带有模糊查询功能的电子字典能够从一定程度上解决这一问题:用户只要输入一个字符串,电子字典就返回与该单词编辑距离最小的几个单词供用户选择。 字符串a与字符串b的编辑距离是指:允许对a或b串进行下列“编辑”操作,将a变为b或b变为a,最少“编辑”次数即为距离。 ? 删除串中某个位置的字母; ? 添加一个字母到串中某个位置; ? 替换串中某一位置的一个字母为另一个字母; JSOI团队正在开发一款电子字典,你需要帮助团队实现一个用于模糊查询功能的计数部件:对于一个待查询字符串,如果它是单词,则返回-1;如果它不是单词,则返回字典中有多少个单词与它的编辑距离为1。

Input

第一行包含两个正整数N (N < = 10,000)和M (M < = 10,000)。 接下来的N行,每行一个字符串,第i + 1行为单词Wi。单词长度在1至20之间。再接下来M行,每行一个字符串,第i + N + 1表示一个待查字符串Qi。待查字符串长度在1至20之间。Wi和Qi均由小写字母构成,文件中不包含多余空格。所有单词互不相同,但是查询字符串可能有重复。 提示:有50%的数据范围:N < = 1,000,M < = 1,000。

Output

输出应包括M行,第i行为一个整数Xi。Xi = -1表示Qi为字典中的单词;否则Xi表示与Qi编辑距离为1的单词的个数。

Sample Input

4 3
abcd
abcde
aabc
abced
abcd
abc
abcdd

Sample Output

-1
2
3

HINT

abcd在单词表中出现过;abc与单词abcd、aabc的编辑距离都是1;abcdd与单词abcd、abcde、abced的编辑距离都是1。

Source

JSOI第二轮Contest1

题解:这道题目里面的编辑距离为1,也就是三种最基本的情况,而且对于字典树而言都不难操作,所以直接乱搞搞就是啦(只要你会字典树)

  1 /**************************************************************
  2     Problem: 1819
  3     User: HansBug
  4     Language: Pascal
  5     Result: Accepted
  6     Time:856 ms
  7     Memory:22080 kb
  8 ****************************************************************/
  9
 10 type
 11     point=^node;
 12     node=record
 13                ex:longint;
 14                next:array[‘A‘..‘Z‘] of point;
 15                chi,bro:point;
 16                ct:char;
 17     end;
 18 var
 19    i,j,k,l,m,n,TP:longint;
 20    head,p,p1:point;
 21    s1:ansistring;
 22 function getpoint:point;inline;
 23          var p:point;c1:char;
 24          begin
 25               new(p);
 26               p^.ex:=0;p^.chi:=nil;
 27               p^.bro:=nil;
 28               for c1:=‘A‘ to ‘Z‘ do p^.next[c1]:=nil;
 29               exit(p);
 30          end;
 31 procedure add(p:point;c1:char);inline;
 32           begin
 33                if p^.next[c1]<>nil then exit;
 34                p^.next[c1]:=getpoint;
 35                p^.next[c1]^.ct:=c1;
 36                p^.next[c1]^.bro:=p^.chi;
 37                p^.chi:=p^.next[c1];
 38           end;
 39 procedure add(s1:ansistring);
 40           var
 41              p:point;i:longint;
 42           begin
 43                p:=head;
 44                for i:=1 to length(s1) do
 45                    begin
 46                         add(p,s1[i]);
 47                         p:=p^.next[s1[i]];
 48                    end;
 49                p^.ex:=1;
 50           end;
 51 function exist(head:point;s1:ansistring;x:longint):boolean;inline;
 52          var p:point;i:longint;
 53          begin
 54               p:=head;
 55               for i:=1 to length(s1) do
 56                   begin
 57                        if p^.next[s1[i]]=nil then exit(false);
 58                        p:=p^.next[s1[i]];
 59                   end;
 60               if x=0 then exit(not(p^.ex=0));
 61               if (p^.ex>0) and (p^.ex<>tp) then
 62                  begin
 63                       p^.ex:=tp;
 64                       exit(true)
 65                  end
 66               else exit(false);
 67          end;
 68 function more(s1:ansistring):longint;
 69          var
 70             p:point;i,j,k,l:longint;
 71          begin
 72               inc(tp);
 73               p:=head;l:=0;
 74               for i:=1 to length(s1) do
 75                   begin
 76                        if exist(p,copy(s1,i+1,length(s1)-i),1) then inc(l);
 77                        if p^.next[s1[i]]=nil then exit(l);
 78                        p:=p^.next[s1[i]];
 79                   end;
 80               exit(l);
 81          end;
 82 function just(s1:ansistring):longint;
 83          var p,P1:point;i,j,k,l:longint;
 84          begin
 85               inc(tp);
 86               p:=head;l:=0;
 87               for i:=1 to length(s1)-1 do
 88                   begin
 89                        p1:=p^.chi;
 90                        while p1<>nil do
 91                              begin
 92                                   if exist(p1,copy(s1,i+1,length(s1)-i),1) then inc(l);
 93                                   p1:=p1^.bro;
 94                              end;
 95                        if p^.next[s1[i]]=nil then exit(l);
 96                        p:=p^.next[s1[i]];
 97                   end;
 98               if p^.chi=nil then exit(l);
 99               p1:=p^.chi;
100               while p1<>nil do
101                     begin
102                          if (p1^.ex>0) and (p1^.ex<>tp) then inc(l);
103                          p1:=p1^.bro;
104                     end;
105               exit(l);
106          end;
107 function less(s1:ansistring):longint;
108          var p,p1:point;i,j,k,l:longint;
109          begin
110               inc(tp);
111               p:=head;l:=0;
112               for i:=1 to length(s1) do
113                   begin
114                        p1:=p^.chi;
115                        while p1<>nil do
116                              begin
117                                   if exist(p1,copy(s1,i,length(s1)-i+1),1) then inc(l);
118                                   p1:=p1^.bro;
119                              end;
120                        if p^.next[s1[i]]=nil then exit(l);
121                        p:=p^.next[s1[i]];
122                   end;
123               p1:=p^.chi;
124               while p1<>nil do
125                     begin
126                          if (p1^.ex>0) and (p1^.ex<>tp) then inc(l);
127                          p1:=p1^.bro;
128                     end;
129               exit(l);
130          end;
131 begin
132
133      readln(n,m);
134      head:=getpoint;
135      for i:=1 to n do
136          begin
137               readln(s1);
138               add(upcase(s1));
139          end;
140      tp:=2;
141      for i:=1 to m do
142          begin
143               readln(s1);
144               s1:=upcase(s1);
145               if exist(head,s1,0) then
146                  begin
147                       writeln(-1);
148                       continue;
149                  end;
150               writeln(more(s1)+just(s1)+less(s1));
151          end;
152
153 end.
时间: 2024-10-05 06:22:46

1819: [JSOI]Word Query电子字典的相关文章

[BZOJ] 1819: [JSOI]Word Query电子字典

1819: [JSOI]Word Query电子字典 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1072  Solved: 361[Submit][Status][Discuss] Description 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功能的电子字典能够从一定程度上解决这一问题:用户只要输入一个字符串,电子字典

[bzoj1819] [JSOI]Word Query电子字典

正解是trie树...在树上跳来跳去什么的 然而在企鹅qq那题的影响下我写了hash... 添加一个字母到一个串,就相当于另一个串删对应位置上的字母. 改变某个位置上的字母,就相当于两个字符串删掉同一个位置上的字母. 所以要记录的东西也不多..存一下每个串删掉每个位置上的字母后的hash值并排序,然后查询的时候二分一下就行了. 但要注意的是,两个字符串可能有多种编辑方式...比方说字符串cccc,分别删掉四个位置上的字母后得到的都是ccc.. 所以一开始要再去一下重.(要不是老司机提醒我还不知道

改变word的语言字典

改变word的语言字典 上周末看论坛有人提出否有方法用代码改变word的语言字典,因为默认的语言会影响现用语言输入的拼写器和其他校对工具.我在网上查了下发现Spire.doc这个产品说它们支持,正好闲来无事所以我用西班牙语做了一次测试,结果发现效果还不错,下面就分享下测试过程. 整个过程使用C#语言,在VS2012环境下,word使用的版本是word2013,所测试的语言是Spanish in Peru,Locale ID Values 是10250.完整的Locale ID Values表,大

Word Puzzles(字典树)

Description Word puzzles are usually simple and very entertaining for all ages. They are so entertaining that Pizza-Hut company started using table covers with word puzzles printed on them, possibly with the intent to minimise their client's percepti

POJ 1204 Word Puzzles(字典树+搜索)

题意:在一个字符矩阵中找每个给定字符串的匹配起始位置和匹配方向(A到H表示八个方向): 思路:将给定字符串插入字典树中,遍历字符矩阵,在每个字符处向八个方向用字典树找. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef struct node { int num; node *next[26]; }node; node *head; char str[1

[leetcode]720. Longest Word in Dictionary字典中最长的单词

b.compareTo(a) 这个函数是比较两个值得大小,如果b比a大,那么返回1 如果小,那么返回-1,相等返回0 如果比较的是字符串,那么比较字典编纂顺序,b靠前返回-1,靠后返回1 这个题的核心虽然是hashtable,但是这个方法还是很重要的,因为自己实现比较字符串很麻烦 /* 用一个Hashset来判断子串是不是在集合里 然后遍历出最长的就行 长度相同的用compareTo方法判断谁的字典顺序靠前 这个题最难的感觉其实是不知道compareTo方法,自己实现还挺麻烦的 */ publi

bzoj1819 电子词典

Description 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功能的电子字典能够从一定程度上解决这一问题:用户只要输入一个字符串,电子字典就返回与该单词编辑距离最小的几个单词供用户选择. 字符串a与字符串b的编辑距离是指:允许对a或b串进行下列“编辑”操作,将a变为b或b变为a,最少“编辑”次数即为距离. ? 删除串中某个位置的字母: ? 添加一个字母到串中某个位置:

(字典树)HDU - 1247 Hat’s Words

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247 题意:输出在所给字典中所有的hat's word.hat's word:是字典中由其他两个单词连接而成的的单词. 分析:现存下所有单词,然后遍历查询.用exist记录当前节点是否组成单词.当遍历某一个单词word时,如果在遍历结束前,在第i个查到当前前缀已经组成了单词,那么再从头遍历检查word.substr(i+1,word.length())[从第1个开到末尾组成的子串].因为可能存在多个

3942 - Remember the Word

3942 - Remember the Word 思路:字典树+dp dp[i]前i个字符,能由给的字串组成的方案数,那么dp[i] = sum(dp[i-k]);那么只要只要在字典树中查看是否有字串str[i-k+1,i]就行了: 1 #include<stdio.h> 2 #include<algorithm> 3 #include<stdlib.h> 4 #include<queue> 5 #include<iostream> 6 #inc