輸入列數和行數,
表示有一個列*行個欄位的字串表,
每個欄位一個字串,
問說能不能找到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;
}
沒有留言:
張貼留言