Database(Uva1592)

//使用map<pair<string,string>,int> 注意map查找比较字符串真心慢,建议用数字添加map,下面就是使用string添加造成比另外一个多出一倍时间

//字符串转数字表示同  集合栈计算机

#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<utility>
#include<map>
using namespace std;
vector<string> shz[10005];
map<pair<string,string>,int> mp;
string str;
char chr;
int main(){
    int a,b;
    while(cin>>a>>b){
        //获得数据块
        getchar();//读取掉3 3 后面的\r \n
        for(int i=0;i<a;i++){
            shz[i].clear();//注意数据结构初始化
            while(chr=getchar()){
//                cout<<chr<<endl;
                if(chr=='\r'||chr=='\n'){
//                    cout<<str<<endl;
                    shz[i].push_back(str);
                    str.clear();
                    break;
                }
                if(chr==','){
//                    cout<<str<<endl;
                    shz[i].push_back(str);
                    str.clear();
                }
                else str=str+chr;
            }
        }
        for(int c1=0;c1<b;c1++){
            for(int c2=c1+1;c2<b;c2++){
                mp.clear();
                for(int i=0;i<a;i++){
                    pair<string,string> p=make_pair(shz[i][c1],shz[i][c2]);
                    if(mp.count(p)){//map字符串查找比较很花时间,建议用字符串矩阵转数字矩阵的方法进行 比较操作 集合栈计算机也是如此
                        cout<<"NO"<<endl;
                        cout<<mp[p]+1<<" "<<i+1<<endl;
                        cout<<c1+1<<" "<<c2+1<<endl;
                        goto label;
                    }
                    mp[p]=i;
                }
            }
        }
        cout<<"YES"<<endl;
        label:;
    }
    return 0;
}
//使用数字化map结果时间就降下来了

#include<iostream>
#include<cstdio>
#include<utility>
#include<string>
#include<vector>
#include<map>
using namespace std;
vector<string> vect;
map<string,int> mp;
vector<int> shz[10005];
int translate(string str){
    if(mp.count(str)) return mp[str];
    vect.push_back(str);
    return mp[str]=vect.size()+1;
}
int main(){
    int a,b;
    string str;
    char chr;
    while(cin>>a>>b){
        mp.clear();
        vect.clear();
        getchar();
        //字符串矩阵转数字矩阵
        for(int i=0;i<a;i++){
            shz[i].clear();
            while(chr=getchar()){
                if(chr=='\n'||chr=='\r'){
                    shz[i].push_back(translate(str));
                    str.clear();
                    break;
                }
                if(chr==','){
                    shz[i].push_back(translate(str));
                    str.clear();
                }
                else str+=chr;
            }
        }
        //双重循环比较转单层比较使用map
        map<pair<int,int>,int> mpp;
        for(int c1=0;c1<b;c1++){
            for(int c2=c1+1;c2<b;c2++){
                mpp.clear();
                for(int i=0;i<a;i++){
                    pair<int,int> p=make_pair(shz[i][c1],shz[i][c2]);
                    if(mpp.count(p)){
                        cout<<"NO"<<endl;
                        cout<<mpp[p]+1<<" "<<i+1<<endl;
                        cout<<c1+1<<" "<<c2+1<<endl;
                        goto label;
                    }
                    mpp[p]=i;
                }
            }
        }
        cout<<"YES"<<endl;
        label:;
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值