一个大学电脑系统通过下面的规则确定学生的用户名:
1. 用户名长度不超过
MAXLEN
个字符。
2. 用户名第一个字符为这个人的first name,转换成小写,忽略非字母的字符
3. 把这个人的last name加到用户名后面(小写),如果超出
MAXLEN
,只保留前
MAXLEN
个字符。
4. 如果规则1~3产生的用户名在数据库中已经存在,若用户名长度为
MAXLEN
,则用户名后面删去最后1个字符,加0~9(按顺序),以保证长度不会超过
MAXLEN
;否则直接加0~9。
5. 如果规则1~4产生的用户名在数据库中已经存在,若用户名长度为
MAXLEN
或
MAXLEN−1
,则用户名后面删去最后几个字符,加10~99(按顺序),以保证长度不会超过
MAXLEN
;否则直接加10~99。
6. 假设上述规则能覆盖所有输入情况。
输入
输入有多组数据,对于每组数据,第一行2个正整数
n(n≤200)
和
MAXLEN
。接下来
n
行,每行一个学生的姓名,不超过80个字符。first name, middle name, last name用空格隔开。大小写和符号不定。
输出
对于每组数据,第一行包含数据组序号,接下来几行每行一个用户名,对应输入的学生姓名。
样例输入
2 6
Jenny Ax
Christos H Papadimitriou
11 8
Jean-Marie d’Arboux
Jean-Marie A d’Arboux
Jean-Marie B d’Arboux
Jean-Marie C d’Arboux
Jean-Marie D d’Arboux
Jean-Marie D d’Arboux
Jean-Marie F d’Arboux
Jean-Marie G d’Arboux
Jean-Marie H d’Arboux
Jean-Marie I d’Arboux
Jean-Marie J d’Arboux
11 9
Jean-Marie d’Arboux
Jean-Marie A d’Arboux
Jean-Marie B d’Arboux
Jean-Marie C d’Arboux
Jean-Marie D d’Arboux
Jean-Marie D d’Arboux
Jean-Marie F d’Arboux
Jean-Marie G d’Arboux
Jean-Marie H d’Arboux
Jean-Marie I d’Arboux
Jean-Marie J d’Arboux
0 0
样例输出
Case 1
jax
cpapad
Case 2
jdarboux
jdarbou1
jdarbou2
jdarbou3
jdarbou4
jdarbou5
jdarbou6
jdarbou7
jdarbou8
jdarbou9
jdarbo10
Case 3
jdarboux
jdarboux1
jdarboux2
jdarboux3
jdarboux4
jdarboux5
jdarboux6
jdarboux7
jdarboux8
jdarboux9
jdarbou10
题解
Java大法好
import java.util.*;
import java.util.stream.Collectors;
public class p5739 {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
int kase = 0;
while (true) {
int n = scanner.nextInt(), maxlen = scanner.nextInt();
if (n == 0 && maxlen == 0) break;
scanner.nextLine();
HashSet<String> set = new HashSet<>();
System.out.printf("Case %d\n", ++kase);
while (--n >= 0) {
String name = scanner.nextLine();
String[] names = name.split(" ");
String first = names[0];
String last = names[names.length - 1];
String original = new StringBuilder().appendCodePoint(first.toLowerCase().chars()
.filter(Character::isAlphabetic)
.findFirst().getAsInt())
.append(last.toLowerCase().codePoints().filter(Character::isAlphabetic).collect(StringBuilder::new,
StringBuilder::appendCodePoint, StringBuilder::append)
.toString()).toString();
if (original.length() > maxlen)
original = original.substring(0, maxlen);
String ans = original;
int len = 1, roll = 0, sq = 1;
while (set.contains(ans)) {
++roll;
if (roll >= sq * 10) {
++len; sq *= 10;
}
if (maxlen - len > original.length())
ans = original + roll;
else
ans = original.substring(0, maxlen - len) + roll;
}
set.add(ans);
System.out.println(ans);
}
}
}
}