《演算法競賽入門經典》---S5----STL
阿新 • • 發佈:2018-11-08
*UVA 1592---map
大概就是要找出兩組位置有相同的string
string查詢對比時太慢 所以 map一下 就是不同的二行 對應二列字串相同
【解】
資料:
How to compete in ACM ICPC,Peter,[email protected]
How to win ACM ICPC,Michael,[email protected]
Notes from ACM ICPC champion,Michael,[email protected]
編號為
0 1 2
3 4 5
6 4 5
因為要找到兩對相同的列,四重遍歷可以找到太慢了!!!(r1,c1)=(r2,c1),(r1,c2)=(r2,c2)考慮將c1,c2兩列的內容一起存到map中,所以map的key為(x,y)
【x,y分別代表對應字串的編號】,map的值為對應的行r1,遍歷行就是r2;所以三重遍歷即可完成。
原文:https://blog.csdn.net/wowowoc/article/details/40554525?utm_source=copy//救救孩子 並不太懂val和q那個 #include <cstdio> #include <cstring> #include <iostream> #include <vector> #include <map> #define BIG 100100 using namespace std; map<string,int> IDcache; map<int,int> ans; vector<vector<int> > tab; int main(){ int n,m,c1,c2,r,val,tmp,f=0,q; string cmd;//儲存每條未處理字串 while(cin>>n>>m){ tab.clear();//編號表 IDcache.clear(); ans.clear(); f=0;// int t=0,row = n,col = m; getchar(); while(n--) { getline(cin,cmd); string str = ""; vector<int> line;//中間的工具 //cout<<cmd<<endl; for(int i=0;i<cmd.size();i++) { if(cmd[i] != ',') str += cmd[i]; //拆分 if(cmd[i] == ',' || i==cmd.size()-1) { if(!IDcache.count(str))IDcache[str] = t++;//編號 line.push_back(IDcache[str]);//將每一行處理好的編號先儲存 str="";//清空 } } tab.push_back(line);//將處理好的拆分行儲存 } for(c1 = 0;c1< col-1 ;c1++) { for(c2 = c1+1;c2 < col;c2++) { val = c1*BIG+c2;//不懂val是幹啥的 for(r = 0;r < row;r++) { q = tab[r][c1]*BIG+tab[r][c2];//woc? if(ans.count(q)) {tmp = r;f=1;break;} ans[q] = r; } if(f==1) break; ans.clear(); } if(f==1) break; } if(f==0) cout<<"YES"<<endl; else{ cout<<"NO"<<endl; cout<<ans[q]+1<<" "<<tmp+1<<endl; cout<<val/BIG+1<<" "<<val%BIG+1<<endl;//??????? } } return 0; }
//經過隊友講解豁然開朗 bing! //後邊附上自己實操程式碼吧 還是 orzzzzz #include <cstdio> #include <cstring> #include <iostream> #include <vector> #include <map> #define BIG 100100 using namespace std; map<string,int> IDcache; map<int,int> ans; vector<vector<int> > tab; int main(){ int n,m,c1,c2,r,val,tmp,f=0,q; string cmd;//儲存每條未處理字串 while(cin>>n>>m){ tab.clear();//編號表 IDcache.clear(); ans.clear(); f=0;// int t=0,row = n,col = m; getchar(); while(n--) { getline(cin,cmd); string str = ""; vector<int> line;//中間的工具 //cout<<cmd<<endl; for(int i=0;i<cmd.size();i++) { if(cmd[i] != ',') str += cmd[i]; //拆分 if(cmd[i] == ',' || i==cmd.size()-1) { if(!IDcache.count(str))IDcache[str] = t++;//編號 line.push_back(IDcache[str]);//將每一行處理好的編號先儲存 str="";//清空 } } tab.push_back(line);//將處理好的拆分行儲存 } for(c1 = 0;c1< col-1 ;c1++) { for(c2 = c1+1;c2 < col;c2++) { val = c1*BIG+c2;//val就是儲存c1 c2 for(r = 0;r < row;r++) { q = tab[r][c1]*BIG+tab[r][c2];//懂了 大概就是儲存一個數 編號一下防止重複 big要大於命令條數 if(ans.count(q)) {tmp = r;f=1;break;} ans[q] = r; } if(f==1) break; ans.clear(); } if(f==1) break; } if(f==0) cout<<"YES"<<endl; else{ cout<<"NO"<<endl; cout<<ans[q]+1<<" "<<tmp+1<<endl; cout<<val/BIG+1<<" "<<val%BIG+1<<endl;//??????? } } return 0; }