统计难题
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 69481 Accepted Submission(s): 24045
Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana band bee absolute acmba
b
band
abc
Sample Output
2
3
1
0
Author
Ignatius.L
Recommend
Ignatius.L
<center style="font-size:15px;font-family:Arial;font-weight:bold;color:#1A5CC8">Statistic | Submit | Discuss | Note
import java.util.Scanner;
public class Main {
static int Size = 26;
static TrieNode root;
static class TrieNode {
int num;
TrieNode son[];
boolean isEnd;
char val;
TrieNode() {
num = 1;
son = new TrieNode[Size];
isEnd = false;
}
}
static void add_str(String str) {
if (str == null || str.length() == 0) {
return;
}
TrieNode node = root;
char ch[] = str.toCharArray();
int length = ch.length, pos;
for (int i = 0; i < length; i++) {
pos = ch[i] - 'a';
if (node.son[pos] == null) {
node.son[pos] = new TrieNode();
node.son[pos].val = ch[i];
} else {
node.son[pos].num++;
}
node = node.son[pos];
}
node.isEnd = true;
}
static int ans(String str) {
if (str == null || str.length() == 0) {
return -1;
}
TrieNode node = root;
char ch[] = str.toCharArray();
int length = ch.length, pos;
for (int i = 0; i < length; i++) {
pos = ch[i] - 'a';
if (node.son[pos] == null) {
return 0;
} else {
node = node.son[pos];
}
}
return node.num;
}
public static void main(String[] args) {
/*BufferedInputStream in = new BufferedInputStream(new FileInputStream("C:\\Users\\date.txt"));
System.setIn(in);*/
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
root = new TrieNode();
String str;
while (!(str = sc.nextLine()).equals("")) {
add_str(str);
}
while (sc.hasNext()) {
str = sc.next();
System.out.println(ans(str));
}
}
}
}</center>
京公网安备 11010502036488号