題目描述
以太網交換機實質上就是一個多端口的網橋。網橋工做在數據鏈路層,根據MAC幀的目的地址對收到的幀進行轉發或過濾。
當網橋收到一個幀時,並非向全部的端口轉發此幀,而是根據此幀的目的MAC地址,查找網橋中的MAC地址表,而後肯定將該幀轉發到哪個端口,或把它丟棄(即過濾)。
以太網交換機轉發幀的步驟:
先查找交換機的MAC地址表中與收到幀的目的地址有無相匹配的項目。
如沒有,則向全部其餘端口(進入的端口除外)轉發;
若有,則按MAC地址表中給出的端口進行轉發(若MAC地址表中給出的端口就是該幀進入交換機的端口,則應丟棄這個幀)。
現假設有一個24端口的以太網交換機,你的任務是編寫程序對收到的MAC幀進行處理。
輸入描述
輸入的第一行爲兩個正整數M、N(M、N<=24),分別表示交換機的MAC地址表有M行,有N個MAC幀進入交換機。
而後就是M行的MAC地址表,每行包括(MAC地址 對應的端口號 時間),相互之間以空格分隔,其中MAC地址用十六進制表示。
最後N行,每行表示進入交換機的MAC幀相關的信息,包括(目的MAC地址 源MAC地址 進入的端口號 進入的時間),相互之間以空格分隔,其中MAC地址用十六進制表示。
輸出描述
對於每行輸入,輸出以太網交換機處理幀的結果。
輸出(目的MAC地址 外出端口號),其中目的MAC地址佔18位,左對齊,具體格式詳見樣例輸出。
若是是向全部端口轉發,端口號輸出ALL;若是是過濾了,端口號輸出NONE。
輸入樣例
5 3
0001.c7ea.e078 20 172
0009.7c7c.c95e 13 163
0009.7ced.ddc6 5 122
0050.0fc3.7770 10 135
00e0.8fb2.7a69 11 142
0001.c7ea.e078 0001.646a.1e5c 12 4568
0001.422b.486b 0009.7ced.ddc6 5 5888
ffff.ffff.ffff 00e0.8fb2.7a69 11 7600
輸出樣例
0001.c7ea.e078 20
0001.422b.486b ALL
ffff.ffff.ffff ALL
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 1e3 + 10;
string s[maxn];
int num[maxn];
int m, n;
struct Node
{
string address;
int num;
}addr[maxn], Addr[maxn];
int main()
{
string addres, Macadd;
int time;
cin >> m >> n;
int i, j, k;
int flag;
for(i = 0; i < m; i++)
{
cin >> addr[i].address >> addr[i].num >> time;
}
for(i = 0; i < n; i++)
{
cin >> Addr[i].address >> addres >> Addr[i].num >> time;
}
for(i = 0; i < n; i++)
{
flag = 0;
for(j = 0; j < m; j++)
{
if(Addr[i].address == addr[j].address && Addr[i].num != addr[j].num)
{
printf("%-18s%-d\n", addr[j].address.c_str(), addr[j].num);
}
else if(Addr[i].address == addr[j].address && Addr[i].num == addr[j].num)
{
printf("%-18sNONE\n", addr[j].address.c_str());
}
else if(Addr[i].address != addr[j].address)
{
flag ++;
k = i;
//printf("%-18sALL\n", Addr[i].address.c_str());
}
//break;
}
if(flag == m)
printf("%-18sALL\n", Addr[k].address.c_str());
}
return 0;
}