ccf csp 201903-4 消息传递接口

#include<bits/stdc++.h>
using namespace std;

void split(const string& s, vector<string>& sv, const char flag = ' '){
	sv.clear();
	istringstream iss(s);
	string temp;
	while(getline(iss, temp, flag)){
		sv.push_back(temp);
	}
} 

int main(){
	string s;
	int T, n;
	cin >> T >> n;
	cin.ignore();
	for(int t = 0; t < T; t++){
		set<int> wait;
		set<int> done;
		int reco[n][2];
		int index[n];
		vector<vector<string> > msg;

		for(int i = 0; i < n; i++){
			vector<string> row;
			getline(cin, s);
			
			split(s, row);
			
			msg.push_back(row);
		}
		
		memset(index, 0, sizeof(index));
		memset(reco, -1, sizeof(reco));
		
		for(int i = 0; wait.size() + done.size() != n; i = (i + 1) % n){
			if(wait.find(i) == wait.end() || done.find(i) == done.end()){
				string s = msg[i][index[i]];
				int tar = atoi(s.substr(1).c_str());
				if(s[0] == 'S'){
					if(reco[tar][0] == i){
						reco[tar][0] = -1;
						wait.erase(tar);
						index[i]++;
						if(index[i] == msg[i].size()) done.insert(i);
						index[tar]++;
						if(index[tar] == msg[tar].size()) done.insert(tar);
					}else{
						reco[i][1] = tar;
						wait.insert(i);
					}
				}else if(s[0] == 'R'){
					if(reco[tar][1] == i){
						reco[tar][0] = -1;
						wait.erase(tar);
						index[i]++;
						if(index[i] == msg[i].size()) done.insert(i);
						index[tar]++;
						if(index[tar] == msg[tar].size()) done.insert(tar);
					}else{
						reco[i][0] = tar;
						wait.insert(i);
					}
				}
			}
		}
		cout << (wait.size() == 0 ? 0 : 1) << endl;
	}
	
	return 0;
}

不保证完全通过,仅测试了样例。

猜你喜欢

转载自blog.csdn.net/lalala_HFUT/article/details/88623972