csp杂记-历年第三题

201403-3 命令行选项

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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<<" -"<
//			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
#include
#include
#include
#include
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 
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 
#include 
#include 
#include 
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 
#include 
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 
#include 
#include 
#include
#include
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 
#include 
#include 
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 
#include 
#include 
#include 
#include 
#include 
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 
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,"");
		str.replace(pos,1,"");
	}
	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,"+link+"\">"+text+"");
	}
}
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("");
			}
			else if(flag==2){
				html[html.size()-1]+="

"
; } flag=0; continue; } else if(line[0]=='#'){ int cnt=count(line.begin(),line.end(),'#'); string tmp; tmp="; char c=cnt+'0'; tmp+=c; tmp+=">"; int s=cnt; while(line[s]==' ') s++; string content=line.substr(s); solve(content); tmp+=content+"+c+">"; html.push_back(tmp); } else if(line[0]=='*'){ if(flag==0){ flag=1; html.push_back("
    "); } int s=1; while(line[s]==' ') s++; string tmp,content; content=line.substr(s); solve(content); tmp="
  • "+content+"
  • "
    ; html.push_back(tmp); } else{ string tmp,content; if(flag==0){ flag=2; tmp+="

    "; } content=line; solve(content); tmp+=content; html.push_back(tmp); } } if(flag==1) html.push_back("

"
); else if(flag==2) html[html.size()-1]+="

"
; for(int i=0;i<html.size();++i) cout<<html[i]<<endl; return 0; } /* CCF201703-3 Markdown */ #include using namespace std; string line, text; // 段落处理 void solve() { // 处理下划线:标签 size_t leftp = text.find("_"); while(leftp != string::npos) { text.replace(leftp, 1, ""); size_t rightp = text.find("_", leftp); text.replace(rightp, 1, ""
); 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, " + tmp2 + "\">" + tmp + ""); leftp = text.find("[", rightp2); } if(text[0] == '#') { // 处理#:标签 int i = 0; while(text[i] == '#') i++; text = " + string(1, '0' + i) + ">" + text.substr(i + 1); text.insert(text.size() - 1, " + string(1, '0' + i) + ">"); } else if(text[0] == '*') { // 处理*:标签
  • ......
text.insert(0, "
    \n"); text.insert(text.size(), "
\n"
); size_t leftp = text.find("*"); while(leftp != string::npos) { size_t rightp = text.find("\n", leftp); text.insert(rightp, ""); text.replace(leftp, 2, "
  • "); leftp = text.find("*", rightp); } } else { // 处理段落:

    text = "

    " + text.substr(0, text.size() - 1) + "

    \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 
    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 
    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 
    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(""),"([0-9]+)"},{regex(""),"([^/]+)"},{regex(""),"(.+)"}
    	};
    	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
    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
    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
    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;
    }
    

    你可能感兴趣的:(csp,c++)