蓝桥杯省赛夺奖冲刺营散列表篇
「弗里的的语言」
题目描述
小发明家弗里想创造一种新的语言,众所周知,发明一门语言是非常困难的,首先你就要克服一个困难就是,有大量的单词需要处理,现在弗里求助你帮他写一款程序,判断是否出现重复的两个单词。
输入描述
第 1行,输入 N,代表共计创造了多少个单词。
第 2行至第 N+1行,输入 N 个单词。
输出描述
输出仅一行。若有重复的单词,就输出重复单词,没有重复单词,就输出 NO,多个重复单词输出最先出现的。
输入输出样例
示例1
输入
6
1fagas
dsafa32j
lkiuopybncv
hfgdjytr
cncxfg
sdhrest
输出
NO
示例2
输入
5
sdfggfds
fgsdhsdf
dsfhsdhr
sdfhdfh
sdfggfds
输出
sdfggfds
运行限制
最大运行时间:3s
最大运行内存:512M
import java.util.Scanner;
public class Main {
static final int h=999983;//余数
static String[] Value=new String[h];//散列表
static String[] UpValue=new String[h];//公共溢出区
static int UpValueCount=0;//溢出区所含数
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();//单词个数
boolean flag=false;//是否冲突
String ans="NO";//答案
while(n-->0) {
String word=sc.next();
if(flag) {
continue;
}
if(isAt(word)) {//已经有这个单词
flag=true;
ans=word;
}else {//添加单词
in(word);
}
}
System.out.println(ans);
}
private static boolean in(String word) {
int n=Hx(word);
if(Value[n]==null) {
Value[n]=word;
return true;
}else if(Value[n].equals(word)){//已经有这个单词了
return false;
}else {
for (int i = 0; i < UpValueCount; i++) {
if(UpValue[i].equals(word)) {
return false;
}
}
UpValue[UpValueCount++]=word;
return true;
}
}
private static boolean isAt(String word) {
int n=Hx(word);//所在位置
if(Value[n]==null) {//没有单词
return false;
}else if(Value[n].equals(word)){//散列表有这个单词
return true;
}else {//公共区有
for (int i = 0; i < UpValueCount; i++) {
if(UpValue[i].equals(word)) {
return true;
}
}
return false;
}
}
private static int Hx(String word) {
return (word.hashCode()%h+h)%h;
}
}