例题5-9 UVA 1592 Database数据库

本来很简单的一道题,却一直RE,查了很长时间才发现是Vector数组开小了,(我日1)

我的思路:

typedef long long ll;

map<string,ll>是把string 映射成ID(long long 类型),vector<string>v_str;这个vector是存放字符串的,用来判断是第几个ID(这个方法在前面的stack例题中用到了)

map<ll,ll>p2;是p2是用来把字符串ID映射成行数r,vector<ll>v[maxn];是用来存放r行c列个字符串的!

然后枚举c1,c2 在枚举行数即可查看连接的字符串是否存在(连接字符串可以用ID1 * 100000 + ID2 表示 是独一无二的!)

发现存在的话,用变量记录行数和列数即可!


代码如下:

#include<iostream>
#include<string>
#include<vector>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod = 100000;
const ll maxn = 10000 + 10;
map<string,ll>pid;
map<ll,ll>p2;
vector<string>v_str;
void input(string &str){
    ll cont = 0;
    str.resize(maxn);
    for(;;){
    ll ch = getchar();
    if (ch != '\r' && ch != '\n' && ch != ',')str[cont++] = ch;
    else break;
    }
    str.resize(cont);
}
ll ID(string str){
    if (!pid.count(str)){
        v_str.push_back(str);
        return pid[str] = v_str.size()-1;
    }
    return pid[str];
}
int main()
{
    ll n,m;
    while(cin >> n >> m){
            vector<ll>v[maxn];
            p2.clear();
            pid.clear();
            v_str.clear();
            for(ll i = 0; i < maxn; ++i)v[i].clear();
            getchar();
            for (ll i = 0; i < n; ++i){
                for (ll j = 0 ;j < m; ++j){
                string str;
                input(str);
                v[i].push_back(ID(str));
                }
            }
            ll t1,t2,t3,t4;
            for (ll c = 0; c < m-1; ++c){
                for (ll c1 = c+1; c1 < m; ++c1){
                    for (ll r = 0; r < n; ++r){
                        ll num1 = v[r][c];
                        ll num2 = v[r][c1];
                        ll numb = num1 * mod + num2;
                        if (!p2.count(numb))p2[numb] = r;
                        else if (p2[numb] != r){
                            t1 = p2[numb]+1;t2 = r+1;t3 = c+1;t4 = c1+1;
                            goto TT;
                        }
                    }
                    p2.clear();
                }
            }
        printf("YES\n");
        continue;
        TT:
            printf("NO\n");
            printf("%lld %lld\n",t1,t2);
            printf("%lld %lld\n",t3,t4);
        }
    return 0;
}


你可能感兴趣的:(C语言,uva)