T1 潜伏着 Label:字符串大水
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cstdlib> 6 #include<map> 7 using namespace std; 8 9 map<char,char> m; 10 int used[99]; 11 string dst,key,con; 12 13 void Error_lrb(){puts("Failed");exit(0);} 14 15 int main(){ 16 // freopen("spy.in","r",stdin);freopen("spy.out","w",stdout); 17 18 cin>>con>>key>>dst; 19 for(int i=0;i<key.size();i++){ 20 if(!m.count(con[i])){ 21 if(used[key[i]]) Error_lrb(); 22 m[con[i]]=key[i],used[key[i]]=1; 23 } 24 else if(m[con[i]]!=key[i]) Error_lrb(); 25 } 26 27 for(char i='A';i<='Z';i++) if(!m.count(i))Error_lrb(); 28 29 for(int i=0;i<dst.size();i++){ 30 if(m.count(dst[i])) cout<<m[dst[i]]; 31 else Error_lrb(); 32 } 33 34 puts(""); 35 fclose(stdin);fclose(stdout);return 0; 36 }
T2 Hankson 的趣味题
T3 最优贸易
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<queue> 6 #include<cstdlib> 7 #include<vector> 8 #define INF 0x3f3f3f3f 9 #define ll long long 10 #define maxn 200005 11 using namespace std; 12 13 int cmp[maxn];//强联通映射表 14 int c_lrb[maxn];//正常点 15 int cu[maxn];//强联通最高价 16 int cl[maxn];//强联通最低价 17 int white_list[maxn]; 18 int N,M; 19 20 vector<int> G_lrb[maxn],rG_lrb[maxn];//正常点邻接表 21 vector<int> G[maxn];//强联通邻接表 22 23 void init_(){ 24 scanf("%d%d",&N,&M); 25 for(int i=1;i<=N;i++) scanf("%d",&c_lrb[i]); 26 for(int i=1;i<=M;i++){ 27 int x,y,op; 28 scanf("%d%d%d",&x,&y,&op); 29 if(op==1){ 30 G_lrb[x].push_back(y);rG_lrb[y].push_back(x); 31 } 32 else{ 33 G_lrb[x].push_back(y);rG_lrb[x].push_back(y); 34 G_lrb[y].push_back(x);rG_lrb[y].push_back(x); 35 } 36 } 37 memset(cl,0x3f,sizeof(cl)); 38 } 39 40 //scc 41 //////////////////////////////////////////////////////////// 42 43 int vis[maxn]; 44 vector<int> vec; 45 void dfs(int x){ 46 if(!white_list[x]) return; 47 vis[x]=1; 48 for(int i=0;i<G_lrb[x].size();i++){ 49 if(!vis[G_lrb[x][i]]) dfs(G_lrb[x][i]); 50 } 51 vec.push_back(x); 52 } 53 54 void rdfs(int x,int k){ 55 cmp[x]=k; 56 vis[x]=1; 57 cl[k]=min(cl[k],c_lrb[x]); 58 cu[k]=max(cu[k],c_lrb[x]); 59 60 for(int i=0;i<rG_lrb[x].size();i++){ 61 if(!vis[rG_lrb[x][i]]) rdfs(rG_lrb[x][i],k); 62 } 63 // puts("x"); 64 } 65 66 void build(int x){ 67 vis[x]=1; 68 int k=cmp[x]; 69 for(int i=0;i<G_lrb[x].size();i++){ 70 if(cmp[G_lrb[x][i]]!=k){ 71 if(!vis[G_lrb[x][i]]) build(G_lrb[x][i]); 72 if(white_list[G_lrb[x][i]])G[k].push_back(cmp[G_lrb[x][i]]); 73 } 74 } 75 } 76 77 void make_list(){ 78 queue<int> q; 79 q.push(N); 80 while(!q.empty()){ 81 int x=q.front();q.pop(); 82 if(vis[x]) continue;white_list[x]=vis[x]=1; 83 for(int i=0;i<rG_lrb[x].size();i++){ 84 q.push(rG_lrb[x][i]); 85 } 86 } 87 } 88 89 int k=0; 90 void scc(){ 91 memset(vis,0,sizeof(vis)); 92 make_list(); 93 memset(vis,0,sizeof(vis)); 94 for(int i=1;i<=N;i++) if(!vis[i]) dfs(i); 95 memset(vis,0,sizeof(vis)); 96 for(int i=vec.size()-1;i>=0;i--){ 97 int x=vec[i]; 98 if(!vis[x]) rdfs(x,++k); 99 } 100 101 memset(vis,0,sizeof(vis)); 102 build(1); 103 } 104 105 //////////////////////////////////////////////////////////// 106 int s,t,ans;//此时节点数为p 107 108 void work_dfs(int x,int pre_low){ 109 pre_low=min(cl[x],pre_low); 110 ans=max(ans,cu[x]-pre_low); 111 112 for(int i=0;i<G[x].size();i++){ 113 if(!vis[G[x][i]]) work_dfs(G[x][i],pre_low); 114 } 115 } 116 117 void work(){ 118 s=cmp[1],t=cmp[N]; 119 memset(vis,0,sizeof(vis)); 120 work_dfs(s,cl[s]); 121 // for(int i=1;i<=N;i++) printf("%d ",white_list[i]); 122 // puts(""); 123 printf("%d",ans); 124 } 125 126 int main(){ 127 // freopen("trade.in","r",stdin);//freopen("trade.out","w",stdout); 128 //注意超时 129 init_(); 130 scc(); 131 work(); 132 133 fclose(stdin);fclose(stdout);return 0; 134 }
写了一个强联通分量,果然T了
T4 靶形数独