1. 程式人生 > >《演算法競賽入門經典》---S5----STL

《演算法競賽入門經典》---S5----STL

*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;
}