csp杂记-历年第三题

201403-3 命令行选项

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <numeric>
#include <list>
#include <set>
#include <stack>
#include <bitset>
#include <sstream>
#include <iterator>

using namespace std;

int main(){
	
//	freopen("in.txt","r",stdin);
	
	int type[128] = {0};
	int n;
	string s,str;
	cin>>s>>n;
	for(int i = 0;i<s.size();++i){
		if(s[i+1]==':'){
			type[s[i]]=2;
			++i;
		}
		else{
			type[s[i]]=1;
		}
	}
	getchar();
//getline(cin,str);
	for(int j = 1;j<=n;++j){
		map<char,string> res;
		getline(cin,str);
		stringstream ss(str);
		string item,tmp;
		ss>>item;
		while(ss>>item){
			if(item.size()==2&&item[0]=='-'&&type[item[1]]==1){
				res[item[1]]="";
			}
			else if(item.size()==2&&item[0]=='-'&&type[item[1]]==2&&ss>>tmp){
				res[item[1]]=tmp;
			}
			else 
				break;
		}
		cout<<"Case "<<j<<":";
//		for(auto element:res){
//			cout<<" -"<<element.first;
//			if(element.second==""){
//				cout<<"";
//			}
//			else{
//				cout<<" "+element.second;
//			}
//		}
		for(map<char,string>::iterator it=res.begin();it!=res.end();++it ){
			cout<<" -"<<it->first;
			if(it->second==""){
				cout<<"";
			}
			else{
				cout<<" "+it->second;
			}
		}
		cout<<endl;
	}

    return 0;
}

201412-3 集合竞价

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
struct Trade{
	double price;
	long long num;
	bool cancel=false;
	bool operator < (const Trade & t)const{
		return price > t.price;
	}
}a[5005];
priority_queue<Trade> buy,sell;

int main(){
	freopen("in.txt","r",stdin);
	string str;
	int i=1,j;
	while(cin>>str){
		if(str=="cancel"){
			cin>>j;
			a[i].cancel=true;
			a[j].cancel=true;
		}
		else if(str=="buy"||str=="sell"){
			cin>>a[i].price>>a[i].num;
			if(str=="buy")
				a[i].price=-a[i].price;
		}
		i++;
	}
	for(int k=1;k<i;++k){
		if(a[k].cancel==true) continue;
		if(a[k].price<0.0){
			buy.push(a[k]);
		}else
			sell.push(a[k]);
	}
	Trade t;
	t.price=0.0;
	t.num=0;
	while(1){
		if(buy.empty()||sell.empty())
			break;
		Trade b=buy.top(),s=sell.top();
		buy.pop();
		sell.pop();
		if(-b.price>=s.price){
			long long k=min(b.num,s.num);
			t.num+=k;
			t.price=-b.price;
			b.num-=k;
			s.num-=k;
			if(b.num>0) buy.push(b);
			if(s.num>0) sell.push(s);
		}
		else
			break;
	}
	printf("%.2f",fabs(t.price));
	cout<<' '<<t.num;
	return 0;
} 

201503-3 节日

#include <iostream>
using namespace std;
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
	int a,b,c,y1,y2;
	cin>>a>>b>>c>>y1>>y2;
	for(int y=y1;y<=y2;++y){
		int w,d;
		int day=0;
		for(int i=1850;i<y;++i){
			if(i%400==0||i%4==0&&i%100!=0){
				day+=366;
			}else 
				day+=365;
		}
		if(y%400==0||y%4==0&&y%100!=0){
			m[2]=29;
		}else{
			m[2]=28;
		}
		for(int i=1;i<a;++i){
			day+=m[i];
		}
		w=day%7+1;
		d=(b-1)*7+((w>=c)?(c+7-w):(c-w));
		if(d>m[a]){
			cout<<"none"<<endl;
		} else{
			printf("%d/%02d/%02d\n",y,a,d);
		}
	}
	return 0;
}

201509-3 模板生成系统

#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	freopen("in.txt","r",stdin);
	int m,n;
	cin>>m>>n;
	string s[m+1];
	map<string,string> mp;
	getchar();
	for(int i=1;i<=m;++i){
		getline(cin,s[i]);
	}
	string key,value;
	for(int i=1;i<=n;++i){
		cin>>key;
		getline(cin,value);
		mp[key]=value.substr(2,value.length()-3);
	}
	int prev,next;
	for(int i=1;i<=m;++i){
		prev=0;
		while(1){
			if((prev=s[i].find("{{ ",prev))==string::npos) break;
			if((next=s[i].find(" }}",prev))==string::npos) break;
			key=s[i].substr(prev+3,next-prev-3);
			s[i].replace(prev,next-prev+3,mp.count(key)?mp[key]:"");
			prev+=mp.count(key)?mp[key].length():0;
		}
		cout<<s[i]<<endl;
	}
	return 0;
}

201512-3 画图

#include <iostream>
#include <cmath>
using namespace std;
char canvas[100][100];
int w,h,q;
void tc(int x,int y,char c){
	if(x<0||x>=w||y<0||y>=h||canvas[x][y]=='+'||canvas[x][y]=='-'||canvas[x][y]=='|'||canvas[x][y]==c){
		return ;
	}
	canvas[x][y]=c;
	tc(x+1,y,c);
	tc(x-1,y,c);
	tc(x,y+1,c);
	tc(x,y-1,c);
}
int main(){
	cin>>w>>h>>q;
	int flag[100]={0};
	int x1,y1,x2,y2,x,y;
	char c;
	for(int i=h-1;i>=0;--i){
		for(int j=0;j<w;++j){
			canvas[j][i]='.';
		}
	}
	for(int k=0;k<q;++k){
		cin>>flag[k];
		//填充 
		if(flag[k]){
			cin>>x>>y>>c;
			tc(x,y,c);
		}
		//划线 
		else{
			cin>>x1>>y1>>x2>>y2;
			//竖线 
			if(x1==x2){
				int ymin,ymax;
				ymin=min(y1,y2);
				ymax=max(y1,y2);
				for(int j=ymin;j<=ymax;++j){
					if(canvas[x1][j]=='-'||canvas[x1][j]=='+')
						canvas[x1][j]='+';
					else{
						canvas[x1][j]='|';
					}
				}
			}
			//横线 
			else if(y1==y2){
				int xmin,xmax;
				xmin=min(x1,x2);
				xmax=max(x1,x2);
				for(int i=xmin;i<=xmax;++i){
					if(canvas[i][y1]=='|'||canvas[i][y1]=='+')
						canvas[i][y1]='+';
					else{
						canvas[i][y1]='-';
					}
				}
			} 
		}
	}
	for(int i=h-1;i>=0;--i){
		for(int j=0;j<w;++j){
			cout<<canvas[j][i];
		}
		cout<<endl;
	}
	return 0;
}

201604-3 路径解析

#include <iostream>
#include <string>
#include <vector>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
	freopen("in.txt","r",stdin);
	int n,pos;
	string cur,road;
	cin>>n>>cur;
	getchar();
	while(n--){
		getline(cin,road);
		if(road[0]!='/'){
			road=cur+"/"+road+"/";
		}
		while((pos=road.find("//"))!=-1){
			int count=2;
			while(road[pos+count]=='/'){
				count++;
			}
			road.erase(pos,count-1);
		}
		while((pos=road.find("/./"))!=-1){
			road.erase(pos+1,2);
		}
		if(road.size()>1&&road[road.size()-1]=='/'){
			road.erase(road.size()-1);
		}
		
		while((pos=road.find("/../"))!=-1){
			if(pos==0){
				road.erase(pos,3);
			}
			else{
				int spos;
				spos=road.rfind("/",pos-1);
				road.erase(spos,pos-spos+3);
			}
			if(road.size()==0){
				road="/";
			}
		}
		cout<<road<<endl;
	}
	return 0;
}

201609-3 炉石传说

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
	int n,cur=0;
	cin>>n;
	vector<pair<int,int> > player[2]={{{30,0}},{{30,0}}};
	while(n--){
		string command;
		int a,b,c;
		cin>>command;
		if(command=="summon"){
			cin>>a>>b>>c;
			player[cur].insert(player[cur].begin()+a,{c,b});
		}
		else if(command=="attack"){
			cin>>a>>b;
			player[cur][a].first-=player[cur^1][b].second;
			player[cur^1][b].first-=player[cur][a].second;
			if(player[cur][a].first<=0&&a!=0){
				player[cur].erase(player[cur].begin()+a);
			}
			if(player[cur^1][b].first<=0&&b!=0){
				player[cur^1].erase(player[cur^1].begin()+b);
			}
		}
		else if(command=="end"){
			cur^=1;
		}
	}
	if(player[0][0].first>0&&player[1][0].first>0){
		cout<<"0"<<endl;
	}
	else if(player[0][0].first>0){
		cout<<"1"<<endl;
	}
	else if(player[1][0].first>0){
		cout<<"-1"<<endl;
	}
	for(int i=0;i<2;++i){
		cout<<player[i][0].first<<endl<<player[i].size()-1<<' ';
		for(int j=1;j<player[i].size();++j){
			cout<<player[i][j].first<<' ';
		}
		cout<<endl;
	}
	return 0;
}

201612-3 权限查询

#include <iostream>
#include <cstdio>
#include <map>
#include <unordered_map>
#include <string>
#include <cmath>
using namespace std;
unordered_map<string,int> privilige;
unordered_map<string,unordered_map<string,int> >role,user;
pair<string,int> split(string&s){
	int i=s.find(':');
	int level=(i!=string::npos)?stoi(s.substr(i+1)):-1;
	return make_pair(s.substr(0,i),level);
}
int main(){
	int p;
	cin>>p;
	getchar();
	while(p--){
		string s;
		cin>>s;
		privilige.insert(split(s));
	}
	int r;
	cin>>r;
	while(r--){
		string s1,s2;
		int n;
		cin>>s1>>n;
		while(n--){
			cin>>s2;
			pair<string,int> p=split(s2);
			if(role[s1].find(p.first)!=role[s1].end()){
				role[s1][p.first]=max(role[s1][p.first],p.second);
			}
			else{
				role[s1][p.first]=p.second;
			}
		}
	}
	int u;
	cin>>u;
	while(u--){
		string s1,s2;
		int n;
		cin>>s1>>n;
		while(n--){
			cin>>s2;
			for(auto &i:role[s2]){
				if(user[s1].find(i.first)!=user[s1].end()){
					user[s1][i.first]=max(user[s1][i.first],i.second);
				}
				else{
					user[s1][i.first]=i.second;
				}
			}
		}
	}
	int q;
	cin>>q;
	while(q--){
		string s1,s2;
		cin>>s1>>s2;
		pair<string,int> p=split(s2);
		if(user.find(s1)!=user.end()&&user[s1].find(p.first)!=user[s1].end()&&p.second<=user[s1][p.first]){
			if(p.second==-1&&user[s1][p.first]!=-1){
				cout<<user[s1][p.first]<<endl;
			}
			else{
				cout<<"true"<<endl;
			}
			
		}
		else{
			cout<<"false"<<endl;
		}
	}	
	return 0;
}

201703-3 markdown

#include <bits/stdc++.h>
using namespace std;
void solve(string &str){
	int pos=0;
	while(1){
		pos=str.find("_");
		if(pos==string::npos) break;
		int t=str.find("_",pos+1);
		str.replace(t,1,"</em>");
		str.replace(pos,1,"<em>");
	}
	while(1){
		pos=str.find("[");
		if(pos==string::npos) break;
		int t=str.find("]",pos+1);
		int end=str.find(")",t+2);
		string text,link;
		text=str.substr(pos+1,t-pos-1);
		link=str.substr(t+2,end-t-2);
		str.replace(pos,end-pos+1,"<a href=\""+link+"\">"+text+"</a>");
	}
}
int main(){
	freopen("in.txt","r",stdin);
	vector<string> html;
	int flag=0;
	string line;
	while(getline(cin,line)){
		if(line.size()==0){
			if(flag==1){
				html.push_back("</ul>");
			}
			else if(flag==2){
				html[html.size()-1]+="</p>";
			}
			flag=0;
			continue;
		}
		else if(line[0]=='#'){
			int cnt=count(line.begin(),line.end(),'#');
			string tmp;
			tmp="<h";
			char c=cnt+'0';
			tmp+=c;
			tmp+=">";
			int s=cnt;
			while(line[s]==' ') s++;
			string content=line.substr(s);
			solve(content);
			tmp+=content+"</h"+c+">";
			html.push_back(tmp);
		}
		else if(line[0]=='*'){
			if(flag==0){
				flag=1;
				html.push_back("<ul>");
			}
			int s=1;
			while(line[s]==' ') s++;
			string tmp,content;
			content=line.substr(s);
			solve(content);
			tmp="<li>"+content+"</li>";
			html.push_back(tmp);
		}
		else{
			string tmp,content;
			if(flag==0){
				flag=2;
				tmp+="<p>";
			}
			content=line;
			solve(content);
			tmp+=content;
			html.push_back(tmp);
		}
	}
	if(flag==1) html.push_back("</ul>");
	else if(flag==2) html[html.size()-1]+="</p>";
	for(int i=0;i<html.size();++i) cout<<html[i]<<endl;
	return 0;
}
/* CCF201703-3 Markdown */
 
#include <bits/stdc++.h>
 
using namespace std;
 
string line, text;
 
// 段落处理
void solve()
{
    // 处理下划线:标签<em></em>
    size_t leftp = text.find("_");
    while(leftp != string::npos) {
        text.replace(leftp, 1, "<em>");
        size_t rightp = text.find("_", leftp);
        text.replace(rightp, 1, "</em>");
        leftp = text.find("_", rightp);
    }
 
    // 处理方括号
    leftp = text.find("[");
    while(leftp != string::npos) {
        size_t rightp = text.find("]", leftp);
        size_t leftp2 = text.find("(", rightp);
        size_t rightp2 = text.find(")", leftp2);
        string tmp = text.substr(leftp + 1, rightp - leftp - 1);
        string tmp2 = text.substr(leftp2 + 1, rightp2 - leftp2 - 1);
        text.replace(text.begin() + leftp, text.begin()+rightp2 + 1, "<a href=\"" + tmp2 + "\">" + tmp + "</a>");
        leftp = text.find("[", rightp2);
    }
 
    if(text[0] == '#') {
        // 处理#:标签<h></h>
        int i = 0;
        while(text[i] == '#') i++;
        text = "<h" + string(1, '0' + i) + ">" + text.substr(i + 1);
        text.insert(text.size() - 1, "</h" + string(1, '0' + i) + ">");
    } else if(text[0] == '*') {
        // 处理*:标签<ul><li></li>......</ul>
        text.insert(0, "<ul>\n");
        text.insert(text.size(), "</ul>\n");
        size_t leftp = text.find("*");
        while(leftp != string::npos) {
            size_t rightp = text.find("\n", leftp);
            text.insert(rightp, "</li>");
            text.replace(leftp, 2, "<li>");
            leftp = text.find("*", rightp);
        }
    } else {
            // 处理段落:<p></p>
            text = "<p>" + text.substr(0, text.size() - 1) + "</p>\n";
    }
 
    cout << text;
    text = "";
}
 
int main()
{
	freopen("in.txt","r",stdin);
    bool flag = false;
 
    getline(cin, line);
    for(; ;) {
        if(line.size() > 0)
            text += line + "\n";
        else if(line.size() == 0 && text.size() > 0)
            solve();
 
        if(flag) break;
        if(!getline(cin, line)) {
            flag = true;
            line = "";
        }
    }
 
    return 0;
}
 
/*
# Heading
## Sub-heading
Paragraphs are separated
by a blank line.
text attributes _italic_.
Bullet list:
* apples
* oranges
* pears
A [link](http://example.com).
*/

201709-3 Json查询

#include <bits/stdc++.h>
using namespace std;
int n,m;
string s,key;
map<string,string> json;
int state;
void handle(string &s){
	for(int i=0;i<s.size();++i){
		if(s[i]=='{'){
			if(state==0){
				key="";
			}else{
				json[key]="OBJECT";
			}
			state=1;
		}
		else if(s[i]=='}'){
			int j;
			for(j=key.size()-1;j>=0;--j){
				if(key[j]=='.')	break;
			}
			if(j>=0){
				key=key.substr(0,j);
			}
			else{
				key="";
			}
		}
		if(s[i]==':') state=2;
		if(s[i]==',') state=1;
		if(s[i]=='"'){
			string tmp;
			for(i++;s[i];++i){
				if(s[i]=='\\'){
					tmp+=s[++i];
				}
				else if(s[i]=='"') break;
				else tmp+=s[i];
			}
			if(state==1){
				if(key=="") key=tmp;
				else key+='.'+tmp;
				state=2;
			}
			else if(state==2){
				json[key]="STRING "+tmp;
				int j;
				for(j=key.size()-1;j>=0;--j){
					if(key[j]=='.') break;
				}
				if(j>=0) key=key.substr(0,j);
				else key="";
				state=1;
			}
		}
	}
}
int main(){
	cin>>n>>m;
	getchar();
	state=0;
	while(n--){
		getline(cin,s);
		handle(s);
	}
	while(m--){
		cin>>s;
		cout<<(json[s]==""?"NOTEXIST":json[s])<<endl;
	}
	return 0;
}

201712-3 Crontab

#include <bits/stdc++.h>
using namespace std;
unordered_map<string,int> monthsAndWeeks={
	{"jan",1},{"feb",2},{"mar",3},{"apr",4},{"may",5},{"jun",6},{"jul",7},{"aug",8},{"sep",9},{"oct",10},{"nov",11},{"dec",12},
	{"sun",0},{"mon",1},{"tue",2},{"wed",3},{"thu",4},{"fri",5},{"sat",6}
};
int n,monthdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
long long s,t;
const int year=(int)(1e8),month=(int)(1e6),day=10000,hour=100;
string crontab[5];
vector<string> command;
set<int> commandTime[5];
map<long long,vector<int> > ans;
int daysOfMonth(int y,int m){
	if((y%400==0||y%4==0&&y%100!=0)&&m==2) return 29;
	return monthdays[m];
}
int determineMonthOrWeek(string s){
	if(isdigit(s[0])) return stoi(s);
	for(char &c:s) c=tolower(c);
	return monthsAndWeeks[s];
}
int determineWeek(int y,int m,int d,int week=4){
	for(int i=1970;i<y;++i){
		int temp=(i%400==0||i%4==0&&i%100!=0)?366:365;
		week=(week+temp)%7;
	}
	for(int i=1;i<m;++i){
		week=(week+daysOfMonth(y,i))%7;
	}
	return (week+d-1)%7;
}
void splitCommand(){
	for(int i=0;i<5;++i){
		commandTime[i].clear();
		if(crontab[i]=="*"){
			int left=0,right=59;
			if(i==1) right=23;
			else if(i==2){
				left =1;
				right=31;
			}else if(i==3){
				left=1;
				right=12;
			}else if(i==4){
				right=6;
			}
			for(int j=left;j<=right;++j){
				commandTime[i].insert(j);
			}
		}
		else{
			for(int j=0,k1=0;true;j=k1+1){
				k1=crontab[i].find(',',j);
				string temp=crontab[i].substr(j,k1==string::npos?k1:k1-j);
				int k2=temp.find('-');
				int p1=determineMonthOrWeek(temp.substr(0,k2)),p2;
				if(k2==string::npos){
					p2=p1;
				}
				else{
					p2=determineMonthOrWeek(temp.substr(k2+1));
				}
				for(int k=p1;k<=p2;++k){
					commandTime[i].insert(k);
				}
				if(k1==string::npos){
					break;
				}
			}
		}
	}
}
void computeCrontab(int c){
	for(int y=s/year;y<=t/year;++y){
		for(int m:commandTime[3]){
			for(int d:commandTime[2]){
				if(d>daysOfMonth(y,m)){
					continue;
				}
				if(find(commandTime[4].begin(),commandTime[4].end(),determineWeek(y,m,d))!=commandTime[4].end()){
					for(int h:commandTime[1]){
						for(int minute:commandTime[0]){
							long long temp=(long long)y*year+m*month+d*day+h*hour+minute;
							if(temp>=s&&temp<t){
								ans[temp].push_back(c);
							}
						}
					}
				}
			}
		}
	}
}
int main(){
	cin>>n>>s>>t;
	command.resize(n);
	for(int i=0;i<n;++i){
		for(int j=0;j<5;++j){
			cin>>crontab[j];
		}
		cin>>command[i];
		splitCommand();
		computeCrontab(i);
	}
	for(auto&i:ans){
		for(auto j:i.second){
			printf("%lld %s\n",i.first,command[j].c_str());
		}
	}
	return 0;
}

201803-3 URL映射

#include <bits/stdc++.h>
using namespace std;
bool isStringDigit(const string&s){//判断字符串是否为整数字符串
    for(char c:s)
        if(!isdigit(c))
            return false;
    return true;
}
int main(){
	freopen("in.txt","r",stdin);
	int n,m;
	cin>>n>>m;
	vector<pair<string,regex> > rules;
	vector<pair<regex,string> > trans={
		{regex("<int>"),"([0-9]+)"},{regex("<str>"),"([^/]+)"},{regex("<path>"),"(.+)"}
	};
	while(n--){
		string p,r;
		cin>>p>>r;
		for(auto &i:trans){
			p=regex_replace(p,i.first,i.second);
		}
		rules.push_back({r,regex(p)});
	}
	smatch result;
	int flag=0;
	while(m--){
		string s;
		cin>>s;
		for(auto i:rules){
			if(regex_match(s,result,i.second)){
				flag=1;
				cout<<i.first;
				for(auto j=1;j<=result.size();++j){
					s=result.str(j);
					if(s!=""&&isStringDigit(s)){
						cout<<' '<<stoi(s);
					}
					else{
						cout<<' '<<s;
					}
				}
				cout<<endl;
				break;
			}
			else{
				flag=0;
			}
		}
		if(!flag){
			cout<<"404"<<endl;
		}
	}
	return 0;
}

201809-3 元素选择器

#include<bits/stdc++.h>
using namespace std;
struct element{
	int father;
	string label,id;
};
vector<element>elements(105);
vector<vector<int> > series;
int main(){
	freopen("in.txt","r",stdin);
	int n,m;
	cin>>n>>m;
	getchar();
	string line;
	for(int i=1;i<=n;++i){
		getline(cin,line);
		int j=0,k=0;
		while(line[j]=='.') ++j;
		if(series.size()<=j/2){
			series.push_back({i});
		}
		else{
			series[j/2].push_back(i);
		}
		for(k=j;k<line.size()&&line[k]!=' ';++k);
		elements[i].label=line.substr(j,k-j);
		for(auto &c:elements[i].label){
			c=tolower(c);
		}
		elements[i].id=(k==line.size())?"":line.substr(k+1);
		elements[i].father=j/2-1<0?-1:series[j/2-1].back(); 
	}
	while(m--){
		getline(cin,line);
		vector<string> query;
		for(int i=0;i<line.size();++i){
			int j=i;
			while(j<line.size()&&line[j]!=' '){
				++j;
			}
			string s=line.substr(i,j-i);
			if(s[0]!='#'){
				for(auto &c:s){
					c=tolower(c);
				}
			}
			query.push_back(s);
			i=j;
		}
		vector<int>ans;
		for(int i=query.size()-1;i<series.size();++i){
			for(int j:series[i]){
				if(elements[j].label==query.back()||elements[j].id==query.back()){
					int k=query.size()-2;
					for(int p=elements[j].father;k>=0&&p!=-1;p=elements[p].father){
						if(elements[p].label==query[k]||elements[p].id==query[k])
							--k;
					}
					if(k<0){
						ans.push_back(j);
					}
				}
			}
		}
		cout<<ans.size()<<' ';
		for(auto i:ans){
			cout<<i<<' ';
		}
		cout<<endl;
	}
	return 0;
}

201812-3 CIDR合并

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long P[34];
struct IP{
	long long s;
	int len;
	bool operator < (const IP &u) const{
		if(s<u.s) return true;
		if(s>u.s) return false;
		return len<u.len;
	}
}ip[N];
bool ziji(IP a,IP b){
	if(a.len>b.len) return false;
	if(a.s/P[a.len+1]!=b.s/P[a.len+1]) return false;
	return true;
}
int l[N];
string ans[N];
int main(){
	P[33]=1;
	for(int i=32;i>=0;i--){
		P[i]=2*P[i+1];
	}
	int n;
	cin>>n;
	if(n==0) return 0;
	string str;
	for(int k=0;k<n;++k){
		cin>>str;
		int t=0,num1=0,num2=0;
		long long ret=0;
		for(int i=0;i<str.size();++i){
			if(str[i]=='/'){
				ret=ret*256+t;
				num2++;
				t=0;
				for(int j=i+1;j<str.size();++j){
					t=t*10+str[j]-'0';
				}
				ip[k].len=t;
				t=0;
				break;
			}
			else if(str[i]=='.'){
				ret=ret*256+t;
				num1++;
				t=0;
			}
			else t=t*10+str[i]-'0';
		}
		if(!num2) ret=ret*256+t;
		if(num1<3){
			for(int i=3;i>num1;i--){
				ret=ret*256;
			}
		}
		if(!num2) ip[k].len=(num1+1)*8;
		ip[k].s=ret;
	}
	sort(ip,ip+n);
	int cnt=0;
	for(int i=1;i<n;++i){
		if(!ziji(ip[cnt],ip[i])) {
			ip[++cnt]=ip[i];
		}
	}
	n=cnt+1;
	for(int i=0;i<n;++i){
		l[i]=i-1;
	}
	for(int i=1;i<n;i++)
    {
        for(int j=l[i];j!=-1;j=l[j])
        {
            if(ip[i].len!=ip[j].len) break;
            int l0=ip[i].len;
            if(ip[i].s/P[l0]!=ip[j].s/P[l0]) break;
            ip[i].s=ip[j].s;
            ip[i].len--;
            l[i]=l[j];
        }
    }
    //转化为输出格式
    cnt=0;
    for(int i=n-1;i!=-1;i=l[i])
    {
        ans[cnt]="";
        int t=0;
        for(int j=1;j<=4;j++)
        {
            t=(ip[i].s%P[(j-1)*8+1])/P[j*8+1];
            string s="";
            do
            {
                s+='0'+t%10;
                t/=10;
            }while(t);
            for(int k=s.length()-1;k>=0;k--)
                ans[cnt]+=s[k];
            if(j==4) break;
            ans[cnt]+=".";
        }
        ans[cnt]+='/';
        t=ip[i].len;
        string s="";
        do
        {
            s+='0'+t%10;
            t/=10;
        }while(t);
        for(int k=s.length()-1;k>=0;k--)
            ans[cnt]+=s[k];
        cnt++;
    }
    //输出
    for(int i=cnt-1;i>=0;i--)
        cout<<ans[i]<<endl;
	return 0;
}

201903-3 点亮数字人生

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

struct Node {
	int func;
	vector<int> in;
	vector<int> out;
} device[505];

int Q,M,N,S;
unordered_map<string,int> um;

int input[10005][505];
int ind[505];
int ans[505];

vector<int> v[505];

void mp_init() {
	um["NOT"]=0;
	um["AND"]=1;
	um["OR"]=2;
	um["XOR"]=3;
	um["NAND"]=4;
	um["NOR"]=5;
}

bool topolog() {
	queue<int> q;
	for(int i=1; i<=N; ++i) {
		if(!ind[i]) {
			q.push(i);
		}
	}
	int cnt=0;
	while(!q.empty()) {
		int f=q.front();
		q.pop();
		++cnt;
		for(auto i:v[f]) {
			ind[i]--;
			if(!ind[i]) {
				q.push(i);
			}
		}
	}
	return cnt==N;
}

int Operation(vector<int> q,int func) {
	if(func==0) return !q[0];
	else {
		int cnt=q.size();
		int r=q[0];
		if(func==1) {
			for(int i=1; i<cnt; ++i) {
				r&=q[i];
			}
			return r;
		} else if(func==2) {
			for(int i=1; i<cnt; ++i) {
				r|=q[i];
			}
			return r;
		} else if(func==3) {
			for(int i=1; i<cnt; ++i) {
				r^=q[i];
			}
			return r;
		} else if(func==4) {
			for(int i=1; i<cnt; ++i) r &= q[i];
			return !r;
		} else if(func==5) {
			for(int i=1; i<cnt; ++i) r |= q[i];
			return !r;
		}
	}
}

int dfs(int s,int u) {
	if(ans[u]!=-1) return ans[u];
	vector<int> t;
	for(auto i:device[u].in) {
		t.push_back(input[s][i]);
	}
	for(auto i:device[u].out) {
		t.push_back(dfs(s,i));
	}
	ans[u]=Operation(t,device[u].func);
	return ans[u];
}

int main() {
	freopen("in.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	mp_init();
	cin>>Q;
	while(Q--) {
		cin>>M>>N;
		for(int i=1; i<=N; ++i) {
			v[i].clear();
			ind[i]=0;
			device[i].in.clear();
			device[i].out.clear();
		}
		for(int i=1; i<=N; ++i) {
			string str;
			cin>>str;
			device[i].func=um[str];
			int k;
			cin>>k;
			for(int j=0; j<k; ++j) {
				cin>>str;
				int num=stoi(str.substr(1));
				if(str[0]=='I') {
					device[i].in.push_back(num);
				} else {
					v[num].push_back(i);
					ind[i]++;
					device[i].out.push_back(num);
				}
			}
		}
		cin>>S;
		for(int i=0; i<S; ++i) {
			for(int j=1; j<=M; ++j) {
				cin>>input[i][j];
			}
		}
		bool flag=topolog();
		if(!flag) {
			cout<<"LOOP"<<endl;
		}
		for(int i=0; i<S; ++i) {
			int s,num;
			cin>>s;
			memset(ans,-1,sizeof(ans));
			for(int j=0; j<s; ++j) {
				cin>>num;
				if(flag) {
					cout<<dfs(i,num);
					if(j==s-1) cout<<endl;
					else cout<<' ';
				}

			}

		}
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值