微軟筆試-Professor Q's Software
描述
Professor Q develops a new software. The software consists of N modules which are numbered from 1 to N. The i-th module will be started up by signal Si. If signal Si is generated multiple times, the i-th module will also be started multiple times. Two different modules may be started up by the same signal. During its lifecircle, the i-th module will generate Ki
輸入
The first line contains an integer T, the number of test cases. T test cases follows.
For each test case, the first line contains contains two numbers N and M, indicating the number of modules and number of signals that Professor Q generates initially.
The second line contains M integers, indicating the signals that Professor Q generates initially.
Line 3~N + 2, each line describes an module, following the format S, K, E1, E2, ... , EK. S represents the signal that start up this module. K represents the total amount of signals that are generated during the lifecircle of this module. And E1 ... EK are these signals.
For 20% data, all N, M <= 10
For 40% data, all N, M <= 103
For 100% data, all 1 <= T <= 5, N, M <= 105, 0 <= K <= 3, 0 <= S, E <= 105.
Hint: HUGE input in this problem. Fast IO such as scanf and BufferedReader are recommended.
輸出
For each test case, output a line with N numbers Ans1, Ans2, ... , AnsN. Ansi is the number of times that the i-th module is started. In case the answers may be too large, output the answers modulo 142857 (the remainder of division by 142857).
樣例輸入3 3 2 123 256 123 2 456 256 456 3 666 111 256 256 1 90 3 1 100 100 2 200 200 200 1 300 200 0 5 1 1 1 2 2 3 2 2 3 4 3 2 4 5 4 2 5 6 5 2 6 7樣例輸出
1 1 3 1 2 2 1 1 2 3 5我的程式碼:
// MS.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include <iostream>
#include <stack>
#include <vector>
#include <map>
using namespace std;
int main()
{
int T=0;
cin >> T;
for (int t = 0; t < T; ++t)
{
int N, M;
cin >> N >> M;
stack<int> stc;
for (int m = 0; m < M; ++m)
{
int tmp;
cin >> tmp;
stc.push(tmp);
}
multimap<int, int> s2n;
vector<vector<int>> mod(N, vector<int>());
vector<int> times(N,0);
for (int n = 0; n < N; ++n)
{
int sig;
cin >> sig;
int num;
cin >> num;
s2n.insert(pair<int, int>(sig, n));
mod[n].resize(num);
for (int i = 0; i < num; ++i)
{
cin >> mod[n][i];
}
}
while (!stc.empty())
{
int stctop = stc.top();
stc.pop();
auto range = s2n.equal_range(stctop);
for (auto p = range.first; p != range.second; ++p)
{
int index = (*p).second;
times[index]++;
vector<int> sigs = mod[index];
for (auto q = sigs.begin(); q != sigs.end(); ++q)
{
stc.push(*q);
}
}
}
for (auto iter = times.begin(); iter != times.end(); ++iter)
{
cout << *iter;
if ((iter + 1) != times.end())
cout << " ";
else
cout << endl;
}
}
//system("pause");
return 0;
}