SGU 552 Database optimization
タイトル:
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をシナリオにしてシナリオの数を記録します
コード:
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;
}