schedule manager
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#include<time.h>
#include <stdio.h>
typedef enum {
INIT,
ADD,
DELETE,
CHANGE,
GETCOUNT
} COMMAND;
void init();
void addEvent(int uid, char ename[], int groupid);
int deleteEvent(int uid, char ename[]);
int changeEvent(int uid, char ename[], char cname[]);
int getCount(int uid);
static int mSeed;
static int pseudo_rand(void)
{
mSeed = mSeed * 431345 + 2531999;
return mSeed & 0x7FFFFFFF;
}
static void make_string(char str[], int seed)
{
mSeed = seed;
int length = 5 + pseudo_rand() % 10;
for (int i = 0; i < length; ++i) {
str[i] = 'a' + pseudo_rand() % 26;
}
str[length] = 0;
}
int mxu = 0, mxc = 0, mxg = 0;
static int run()
{
int answer = 100;
int cmd, p1, p2, p3, p4;
char str1[15], str2[15];
int N, ret, flag;
scanf("%d %d %d", &cmd, &N, &flag);
if (N > mxc)mxc = N;
init();
for (int i = 1; i < N; ++i) {
scanf("%d", &cmd);
switch (cmd) {
case ADD:
if (flag == 1) {
scanf("%d %s %d", &p1, str1, &p3);
}
else {
scanf("%d %d %d", &p1, &p2, &p3);
make_string(str1, p2);
}
addEvent(p1, str1, p3);
if (p1 > mxu)mxu = p1;
if (p3> mxg)mxg = p3;
break;
case DELETE:
if (flag == 1) {
scanf("%d %s %d", &p1, str1, &p3);
}
else {
scanf("%d %d %d", &p1, &p2, &p3);
make_string(str1, p2);
}
ret = deleteEvent(p1, str1);
if (ret != p3)
answer = 0;
break;
case CHANGE:
if (flag == 1) {
scanf("%d %s %s %d", &p1, str1, str2, &p4);
}
else {
scanf("%d %d %d %d", &p1, &p2, &p3, &p4);
make_string(str1, p2);
make_string(str2, p3);
}
ret = changeEvent(p1, str1, str2);
if (ret != p4)
answer = 0;
break;
case GETCOUNT:
scanf("%d %d", &p1, &p2);
ret = getCount(p1);
if (ret != p2)
answer = 0;
break;
default:
break;
}
}
return answer;
}
int main()
{
int begin, end;
begin = clock();
int T;
freopen("sample_input.txt", "r", stdin);
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++) {
printf("#%d %d\n", tc, run());
}
end = clock();
printf("total time: %dms\n", end - begin / CLOCKS_PER_SEC * 1000);
return 0;
}
#define HASHNUM 217
#define MASTER 0
#define NORMAL 1
struct SCHEDULE_NODE
{
int Uid;
char name[15];
int type;
SCHEDULE_NODE* front;
SCHEDULE_NODE* next;
};
int usercount[1000];
SCHEDULE_NODE schedule[100][HASHNUM];
int get_hash_num(char ename[]) {
int tmp = 0;
for (int i = 0; ename[i] != 0; i++)
{
tmp = (tmp * 26 + ename[i] - 'a') % HASHNUM;
}
return tmp;
}
bool str_cmp(char* a, char* b) {
int i = 0;
for (; a[i] != 0 && b[i] != 0; i++)
{
if (a[i] != b[i])
return false;
}
if (i == 0)
return false;
return true;
}
void str_cpy(char in[], char out[]) {
int i = 0;
for (; in[i] != 0; i++)
{
out[i] = in[i];
}
out[i] = 0;
}
void init() {
for (int i = 0; i < 1000; i++)
{
usercount[i] = 0;
}
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < HASHNUM; j++) {
schedule[i][j].next = 0;
schedule[i][j].Uid = -1;
}
}
}
void addEvent(int uid, char ename[], int groupid) {
int hash_num = get_hash_num(ename);
SCHEDULE_NODE* tmp = &schedule[groupid][hash_num];
int mode = MASTER;
while (tmp != 0)
{
if (str_cmp(ename, tmp->name))
{
if (tmp->type == MASTER)
{
mode = NORMAL;
}
}
if (tmp->next != 0)
tmp = tmp->next;
else
break;
}
SCHEDULE_NODE* node = new SCHEDULE_NODE();
node->Uid = uid;
node->type = mode;
str_cpy(ename, node->name);
node->front = tmp;
node->next = tmp->next;
tmp->next = node;
usercount[uid]++;
}
int deleteEvent(int uid, char ename[]) {
int num = 0;
int hash_num = get_hash_num(ename);
for (int i = 0; i < 100; i++)
{
SCHEDULE_NODE* tmp = &schedule[i][hash_num];
int mode = NORMAL;
while (tmp != 0)
{
if (str_cmp(ename, tmp->name))
{
if (tmp->Uid == uid)
{
if (tmp->type == MASTER)
{
mode = MASTER;
}
tmp->front->next = tmp->next;
if (tmp->next != 0)
tmp->next->front = tmp->front;
usercount[tmp->Uid]--;
num++;
if (mode == NORMAL)
break;
}
else if (mode == MASTER)
{
tmp->front->next = tmp->next;
if (tmp->next != 0)
tmp->next->front = tmp->front;
usercount[tmp->Uid]--;
num++;
}
}
tmp = tmp->next;
}
}
return num;
}
int changeEvent(int uid, char ename[], char cname[]) {
int num = 0;
int hash_num = get_hash_num(ename);
for (int i = 0; i < 100; i++)
{
SCHEDULE_NODE* tmp = &schedule[i][hash_num];
int mode = NORMAL;
while (tmp != 0)
{
if (str_cmp(ename, tmp->name))
{
if (tmp->Uid == uid)
{
if (tmp->type == MASTER)
{
mode = MASTER;
}
tmp->front->next = tmp->next;
if (tmp->next != 0)
tmp->next->front = tmp->front;
usercount[tmp->Uid]--;
addEvent(tmp->Uid, cname, i);
num++;
if (mode == NORMAL)
break;
}
else if (mode == MASTER)
{
tmp->front->next = tmp->next;
if (tmp->next != 0)
tmp->next->front = tmp->front;
usercount[tmp->Uid]--;
addEvent(tmp->Uid, cname, i);
num++;
}
}
tmp = tmp->next;
}
}
return num;
}
int getCount(int uid) {
return usercount[uid];
}

浙公网安备 33010602011771号