M: Mysterious Conch 字符串哈希
Problem Description
小明有一个神奇的海螺,你对海螺说一段字符串,海螺就会返回一个单词,有字符串里面的所有字符组成
如告诉海螺
“lloeh”
海螺则会告诉你
“hello”
如果有多个单词对应,海螺则会输出字典序最小的那个,如果没找到输入’nothing to find’(不带引号)
Input
第一行一个m表示m个单词 (1≤m≤105)
接下来m行,每行一个字符串
第m+2行,输入一个k (1≤k≤105)
接来下k行,每行一串字符串
(m+k个字符串长度之和小于107,每一个字符串中的相同字母不会超过5个)
Output
输出k行,如果查到单词输出字典序最小的那个,否则输出’nothing to find’(不带引号)
Sample Input
5
abcd
dbca
hello
lloeh
xyz
3
cdab
holle
yxz
Sample Output
abcd
hello
xyz
好像是测试数据有问题,AC不了 :)
#include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<string> #include<vector> typedef unsigned long long ull; using namespace std; string s[1000005], ss[1000005]; vector<ull>p[1000005]; ull hs(string sss) { ull temp = 0; for (ull i = 0; i < sss.length(); i++) temp = (temp + (ull)pow(3,(sss[i] - 'a'))) % 133331; return temp; } int main() { ull n, m; cin >> n; ios::sync_with_stdio(false); for (ull i = 0; i < n; i++) { std::cin >> s[i]; p[hs(s[i])].push_back(i); } cin >> m; for (ull i = 0; i < m; i++) { std::cin >> ss[i]; ull temp = hs(ss[i]); if (p[temp].size()== 0) cout << "nothing to find" << endl; else { string w[10000]; for (ull i = 0; i < p[temp].size(); i++) { w[i] = s[p[temp][i]]; } sort(w, w + p[temp].size()); cout << w[0] << endl; } } return 0; }
等风起的那一天,我已准备好一切