计算机网络没学好,比赛的时候脑子一抽题意理解错了,赛后自己写了1A,内流满面。。。。
和一般的trie不太一样,这里的trie每个节点开一个vector存网络的id
恩,就这样,跑的挺快的 78ms
#include<map>
#include<set>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
//-------------------------------------
char op[5];
int num_ip[1050] = {0};
int temp_ip[50];
int find_ip[50];
int ip[1050][16][50];
int cnt;
//-------------------------------------
void debug(int id,int t){
for(int i = 0; i < 32; i++)
printf("%d",ip[id][t][i]);
puts("");
}
void dfs(int n){
if(n == 0) return;
temp_ip[cnt++] = n % 2;
dfs(n / 2);
}
//--------------Trie--------------------
const int maxn = 800005;
struct Trie{
int ch[maxn][2];
int cnt;
vector<int>vis[maxn];
int have[1050];
void init(){
cnt = 1;
memset(ch[0],0,sizeof(ch[0]));
}
void newNode(){
memset(ch[cnt],0,sizeof(ch[cnt]));
vis[cnt].clear();
cnt ++;
}
void insert(int id,int addr[],int num){
int u = 0;
for(int i = 0; i < num; i++){
if(!ch[u][addr[i]]){
ch[u][addr[i]] = cnt;
newNode();
}
u = ch[u][addr[i]];
}
//printf("%d\n",u);
vis[u].push_back(id);
}
int find(int op,int addr[]){
int u = 0;
if(!op) memset(have,0,sizeof(have));
for(int i = 0; i < 32; i++){
if(!ch[u][addr[i]]) return - 1;
u = ch[u][addr[i]];
//printf("%d\n",u);
if(vis[u].size() != 0){
int Size = vis[u].size();
for(int j = 0; j < Size; j++){
if(!op){
//printf("%d\n",vis[u][j]);
have[vis[u][j]] = 1;
}
else
if(have[vis[u][j]] && num_ip[vis[u][j]]){
//printf("%d\n",vis[u][j]);
return 1;
}
}
}
}
return -1;
}
}trie;
int main(){
trie.init();
int id,num;
int p[5];
int ip_num;
while(scanf("%s",op) != EOF){
if(op[0] == 'E'){
scanf("%d",&id);
scanf("%d",&num_ip[id]);
for(int i = 0; i < num_ip[id]; i++){
scanf("%d.%d.%d.%d/%d",&p[0],&p[1],&p[2],&p[3],&p[4]);
ip_num = 0;
for(int j = 0; j < 4; j++){
cnt = 0;
dfs(p[j]);
for(int k = cnt; k < 8; k++)
ip[id][i][ip_num++] = 0;
for(int k = cnt - 1; k >= 0; k--)
ip[id][i][ip_num++] = temp_ip[k];
}
trie.insert(id,ip[id][i],p[4]);
}
}
else if(op[0] == 'F'){
int t[2];
for(int i = 0; i < 2; i++){
scanf("%d.%d.%d.%d",&p[0],&p[1],&p[2],&p[3]);
ip_num = 0;
for(int j = 0; j < 4; j++){
cnt = 0;
dfs(p[j]);
for(int k = cnt; k < 8; k++)
find_ip[ip_num++] = 0;
for(int k = cnt - 1; k >= 0; k--)
find_ip[ip_num++] = temp_ip[k];
}
//for(int j = 0; j < 32; j++) printf("%d",find_ip[j]); puts("");
t[i] = trie.find(i,find_ip);
}
if(t[1] == 1)
puts("F");
else
puts("D");
}
else{
int v;
scanf("%d",&v);
num_ip[v] = 0;
}
//printf("%d\n",trie.cnt);
}
return 0;
}
/*
E 1 2 123.45.4.0/22 123.45.6.78/22
*/