题型:字典树
思路:
答案 ans=nodesum*2-max+n
nodesum:字典树中除根节点外的节点总数
max:最长单词长度
n:单词个数
ps:不知道为啥用Scanner就过不了,io就过了,也没有tle)玄学
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
public static String next() throws IOException {
in.nextToken();
return (String) in.sval;
}
public static void main(String[] args) throws IOException {
while (in.nextToken()!=StreamTokenizer.TT_EOF) {
int n = (int)in.nval;
Trie trie = new Trie();
int max = 0;
for (int i = 0; i < n; i++) {
String str =next();
if (str.length() > max) {
max = str.length();
}
trie.insert(str);
}
System.out.println(trie.sum * 2 - max + n);
}
}
}
class Trie {
private int size = 26;
private TrieNode root;
int sum;
public Trie() {
root = new TrieNode();
sum=0;
}
private class TrieNode {
private int num;
private TrieNode[] son;
private boolean isEnd;
private char val;
public TrieNode() {
num = 1;
son = new TrieNode[size];
isEnd = false;
}
}
public void insert(String str) {
if (str == null || str.length() == 0)
return;
TrieNode node = root;
char letters[] = str.toCharArray();
for (int i = 0, len = str.length(); i < len; i++) {
int pos = letters[i] - 'a';
if (node.son[pos] == null) {
node.son[pos] = new TrieNode();
node.son[pos].val = letters[i];
this.sum++;
} else {
node.son[pos].num++;
}
node = node.son[pos];
}
node.isEnd = true;
}
public TrieNode getRoot() {
return this.root;
}
}