SGU 552 Database optimization

2498 ワード

タイトル:
n個の物品毎に最大4個の属性があるm回の問い合わせ毎に最大4個の属性を問い合わせる出力これらの属性を含む物品の個数
考え方:
1つの物品の属性がa b c dである場合、a、b、c、d、ab、ac、ad、bc、bd、bd、cd、abc、abd、acd、bcd、bcd、abcd、abcd、abcdは、各物品がそれに寄与する問合せ++だけで、abcdが秩序正しく配列されていることに注意することができる
それからmapを作って文字列hashを数にしてから数の組み合わせhashをシナリオにしてシナリオの数を記録します
コード:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<bitset>
using namespace std;
typedef unsigned long long LL;
#define seed 133331ULL

int n;
LL id;
map<string, LL> fzc;
map<LL, int> ans1;
map<LL, int> ans2;
map<LL, int> ans3;
map<LL, int> ans4;
LL a[5];
string str;

int main() {
	int i, j, k, f1, f2, f3, f4;
	id = 1;
	cin >> n;
	for (i = 0; i < n; i++) {
		cin >> k;
		for (j = 0; j < k; j++) {
			cin >> str;
			if (fzc[str] == 0)
				fzc[str] = id++;
			a[j] = fzc[str];
		}
		if (k > 1)
			sort(a, a + k);
		for (f1 = 0; f1 < k; f1++) {
			ans1[a[f1]]++;
			if (k >= 2) {
				for (f2 = f1 + 1; f2 < k; f2++) {
					ans2[a[f1] * seed + a[f2]]++;
					if (k >= 3) {
						for (f3 = f2 + 1; f3 < k; f3++) {
							ans3[(a[f1] * seed + a[f2]) * seed + a[f3]]++;
							if (k >= 4) {
								for (f4 = f3 + 1; f4 < k; f4++)
									ans4[((a[f1] * seed + a[f2]) * seed + a[f3])
											* seed + a[f4]]++;
							}
						}
					}
				}
			}
		}
	}
	cin >> n;
	while (n--) {
		cin >> k;
		for (j = 0; j < k; j++) {
			cin >> str;
			if (!fzc.count(str))
				a[j] = 0;
			else
				a[j] = fzc[str];
		}
		//for (j = 0; j < k; j++)
		//	printf("%llu ", a[j]);
		//cout << ((a[0] * seed + a[1]) * seed + a[2]) * seed + a[3] << endl;
		//printf("
"); if (k > 1) sort(a, a + k); if (a[0] == 0) { cout << 0 << endl; continue; } if (k == 1) cout << ans1[a[0]] << endl; else if (k == 2) cout << ans2[a[0] * seed + a[1]] << endl; else if (k == 3) cout << ans3[(a[0] * seed + a[1]) * seed + a[2]] << endl; else cout << ans4[((a[0] * seed + a[1]) * seed + a[2]) * seed + a[3]] << endl; } //cout << (*ans4.begin()).first << " " << (*ans4.begin()).second << endl; return 0; }