2015年8月5日 星期三

[UVA] 1592 - Database

題意:
輸入列數和行數,
表示有一個列*行個欄位的字串表,
每個欄位一個字串,
問說能不能找到r1,r2,c1,c2
使得字串(r1,c1)==字串(r2,c1) and 字串(r1,c2)==字串(r2,c2),
如果有就輸出NO,並輸出哪兩列的哪兩行
如果沒有就輸出YES
範例輸入:










所以輸出
2 3
2 3

方法:
這題要先做預處理喔,
將字串都以編號代替,
不然除了會TLE外,
還會TLE。
再來不需要一個一個列舉,
只需要枚舉行就好,(因為題目有說行數<=10)
 再把每一列的兩個字串編號和列數以二元組存取,
例如該列有兩個字串編號:15和23,
那就將10和23合體當first,該列數當second,
(1500023,2),表示第二列有字串10和字串23,
如果該二元組已經存在,
表示找到題目所求,即可輸出!
注意只要找到一組就好哦!

/* 20150803
 * hanting
 * UVa 1592 - Database
 * C++
 */
#include <iostream>
#include <map>
#include <cstring>//strtok
using namespace std;
map<string,int> ID;
int sum=0;
int idx=1;
int StrID(string str)
{
    if(ID[str]) return ID[str];
    return ID[str]=idx++;
}
int main()
{
    int row,col;
    while(cin>>row>>col)
    {
        cin.get();
        string table[row+2][col+2];
        string tmp;
        for(int i=1;i<=row;i++)
        {
            getline(cin,tmp);//注意要讀一整行再做切割
            char *pch=strtok((char*)tmp.c_str(),",");

            int j=1;
            while(pch)
            {
                table[i][j++]=pch;
                pch=strtok(NULL,",");
            }
        }
        int IDtable[row+2][col+2];//預處理,將字串予編號
        for(int i=1;i<=row;i++)
        {
            for(int j=1;j<=col;j++)
            {
                IDtable[i][j]=StrID(table[i][j]);
            }
        }
        bool Yes=true;//找到一項即可
        for(int i=1;i<=col and Yes;i++)
        {
            for(int j=i+1;j<=col and Yes;j++)
            {
                map<int,int> Map;//Map[idx]=列
                for(int k=1;k<=row and Yes;k++)
                {
                    int idx=IDtable[k][i]*100000+IDtable[k][j];
                    if(Map.count(idx))
                    {
                        cout<<"NO"<<endl;
                        cout<<Map[idx]<<" "<<k<<endl;
                        cout<<i<<" "<<j<<endl;
                        Yes=false;
                    }
                    else
                    {
                        Map[idx]=k;
                    }
                }
            }
        }
        if(Yes) cout<<"YES"<<endl;

    }
    return 0;
}

沒有留言:

張貼留言