【例题5-9 UVA - 1592】Database

【链接】 我是链接,点我呀:)
【题意】

在这里输入题意

【题解】

枚举不同的列是哪两个列,然后枚举行。 把那一行的这两列的字符接在一起,然后用map判重。 为了防止逐个比较字符。 可以一开始先把字符串转换成一个整数。 这样,每一行就是一个整数的二元组(x,y)了; 用map,int>判重也可以; 或者把它转成long long的数字->x乘一个10W把Y加上去 后者更好。 **关同步的时候,getchar()不能用,可以用cin.get()代替**

【代码】

#include <bits/stdc++.h>
using namespace std;

const int N = 1e4;
const int M = 10;

map <string, int > dic;
map <long long, int> mmap;
int n, m;
string S[N+10][M+10];
int a[N + 10][M + 10];

bool ok()
{
	int tot = 0;
	dic.clear();
	for (int i = 1;i <= n;i++)
		for (int j = 1; j <= m; j++)
		{
			if (dic[S[i][j]] == 0) dic[S[i][j]] = ++tot;
			a[i][j] = dic[S[i][j]];
		}
	for (int j = 1; j <= m; j++)
		for (int k = j + 1; k <= m; k++)
		{
			mmap.clear();
			for (int i = 1; i <= n; i++)
			{
				long long ts = 1LL * a[i][j] * 100000 + a[i][k];
				if (mmap.find(ts) != mmap.end())
				{
					cout << "NO" << endl;
					cout << mmap[ts] << ' ' << i << endl;
					cout << j << ' ' << k << endl;
					return true;
				}
				else
					mmap[ts] = i;
			}
		}
	return false;
}

int main()
{
	//freopen("F:\\rush.txt", "r", stdin);
	ios::sync_with_stdio(0), cin.tie(0);
	while (cin >> n >> m)
	{
		cin.get();
		for (int i = 1;i <=n;i++)
			{
				string ss;
				getline(cin, ss);
				int len = ss.size(),x = 0;
				for (int j = 1; j <= m; j++,x++)
				{
					string s = "";
					while (x <= len - 1 && ss[x] != ',')
					{
						s += ss[x];
						x++;
					}
					S[i][j] = s;
				}
			}
		if (!ok()) cout << "YES" << endl;
	}
	return 0;
}
posted @ 2017-10-13 17:59  AWCXV  阅读(129)  评论(2编辑  收藏  举报