Автор задачи: Кирилл Бороздин
Источник задачи: Уральская региональная командная олимпиада по программированию 2013
Ограничения:
Время: | 0.5 секунды |
Память | 64 Мб |
Условие
- «register username password» — зарегистрировать нового пользователя с именем «username» и установить для него пароль «password». Если такой пользователь уже есть в базе данных, необходимо выдать ошибку «fail: user already exists». Иначе нужно вывести сообщение «success: new user added».
- «login username password» — войти в систему от имени пользователя «username» с паролем «password». Если такого пользователя не существует в базе данных, необходимо выдать «fail: no such user». Иначе, если был введен неправильный пароль, нужно выдать «fail: incorrect password». Иначе, если пользователь уже находится в системе в данный момент, необходимо вывести «fail: already logged in». Иначе нужно вывести сообщение «success: user logged in».
- «logout username» — выйти из системы пользователем «username». Если такого пользователя не существует, необходимо вывести «fail: no such user». Иначе, если пользователь не находится в системе в данный момент, следует выдать «fail: already logged out». Иначе необходимо выдать сообщение «success: user logged out».
Исходные данные
Результат
Пример
Исходные данные | Результат |
6register vasya 12345
login vasya 1234 login vasya 12345 login anakin C-3PO logout vasya logout vasya |
success: new user addedfail: incorrect password
success: user logged in fail: no such user success: user logged out fail: already logged out |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
import java.util.Scanner; import java.util.StringTokenizer; import java.util.Vector; import java.util.TreeMap; import java.lang.NumberFormatException; public class Timus2002App { //структура, описывающая атрибуты учетной записи public class AccountInfo { public String password; public boolean loggedIn; public AccountInfo(String argPassword, boolean argLoggedIn) { password = argPassword; loggedIn = argLoggedIn; } } //база данных учетной записи public class AccountDatabase { public static final int OK = 0; public static final int NOT_REGISTERED = 1; public static final int WRONG_PASSWORD = 2; public static final int ALREADY_LOGGED_IN = 3; public static final int ALREADY_LOGGED_OUT = 4; private TreeMap<String, AccountInfo> map; //конструктор public AccountDatabase() { map = new TreeMap<String, AccountInfo>(); } //регистрация новой учетной записи public boolean register(String name, String password) { AccountInfo info = map.get(name); if (info != null) { return false; } map.put(name, new AccountInfo(password, false)); return true; } //вход в систему public int login(String name, String password) { int result = NOT_REGISTERED; AccountInfo info = map.get(name); if (info != null) { if (!info.password.equals(password)) { result = WRONG_PASSWORD; } else if (info.loggedIn) { result = ALREADY_LOGGED_IN; } else { map.put(name, new AccountInfo(info.password, true)); result = OK; } } return result; } //выход из системы public int logout(String name) { int result = NOT_REGISTERED; AccountInfo info = map.get(name); if ( info != null ) { if ( info.loggedIn ) { map.put(name, new AccountInfo(info.password, false)); result = OK; } else { result = ALREADY_LOGGED_OUT; } } return result; } } public static void main(String[] args) { int loginCount = 0; String line = null; Scanner in = new Scanner(System.in); //System.out.println("please enter number of logins: "); line = ( in.hasNextLine( ) ) ? in.nextLine() : null; try { loginCount = Integer.parseInt(line.trim()); } catch( NumberFormatException e ) { } if ( loginCount < 1 || loginCount > 100 ) { System.out.println("**** ERROR: wrong number of logins ****"); in.close(); return; } Timus2002App mainObj = new Timus2002App(); AccountDatabase accounts = mainObj.new AccountDatabase(); for( int i = 0; i < loginCount; i++ ) { //System.out.println("please enter command:"); line = ( in.hasNextLine( ) ) ? in.nextLine() : null; if ( line == null || line.isEmpty() ) { System.out.println("**** ERROR: empty input, abort processing ****"); break; } //превращение введенной строки текста в вектор лексем StringTokenizer st = new StringTokenizer(line, " "); Vector<String> tokens = new Vector<String>(); while (st.hasMoreTokens()) { tokens.add( st.nextToken() ); } //превращение вектора лексем в команду с аргументами String command = ( tokens.size() > 0 ) ? tokens.get(0) : null; String name = ( tokens.size() > 1 ) ? tokens.get(1) : null; String password = ( tokens.size() > 2 ) ? tokens.get(2) : null; String message = null; //выполнение команд if ( command.equals("register")) { if ( name != null || password != null ) { if ( accounts.register(name, password) ) { message = "success: new user added"; } else { message = "fail: user already exists"; } } else { message = "fail: missing user name or password"; } } else if ( command.equals("login")) { if ( name != null || password != null ) { switch( accounts.login(name, password) ) { case AccountDatabase.NOT_REGISTERED: message = "fail: no such user"; break; case AccountDatabase.WRONG_PASSWORD: message = "fail: incorrect password"; break; case AccountDatabase.ALREADY_LOGGED_IN: message = "fail: already logged in"; break; default: message = "success: user logged in"; break; } } else { message = "fail: missing user name or password"; } } else if ( command.equals("logout")) { if ( name != null ) { switch( accounts.logout(name) ) { case AccountDatabase.ALREADY_LOGGED_OUT: message = "fail: already logged out"; break; case AccountDatabase.NOT_REGISTERED: message = "fail: no such user"; break; default: message = "success: user logged out"; break; } } else { message = "fail: missing user name"; } } if ( message != null ) { System.out.println(message); } } in.close(); } } |
Данная программа представляет собой типичный пример использования таблицы символов, согласно терминологии Coursera. Для доступа к учетным записям используется интерфейс Map, а для реализации самой базы данных учетных записей — объект типа TreeMap. Учетная запись пользователей реализована в виде одного элемента типа Map.entry, где имя пользователя — это ключ, а атрибуты учетной записи — пароль и флаг подключен/отключен — реализованы в виде отдельной структуры AccountInfo, которая является значением этого ключа.
Время работы | Выделено памяти |
0.124 | 1 928 КБ |