例题5-9 UVA 1592 Database数据库

来源:互联网 发布:心动网络密保中心 编辑:程序博客网 时间:2024/05/08 10:47

本来很简单的一道题,却一直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;}


0 0
原创粉丝点击