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 ( ) {
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 ( ) ;
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 ( 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;
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 ;
}
#include <bits/stdc++.h>
using namespace std;
string line, text;
void solve ( )
{
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 ] == '#' ) {
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 ] == '*' ) {
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 {
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 ;
}
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 ;
}