UVA 12338 Anti-Rhyme Pairs(hash + 二分)题解
题意:给出两个字符串的最大相同前缀。
思路:hash是要hash,不hash是不可能的。hash完之后从头遍历判断超时然后陷入沉默,然后告诉我这能二分orz,二分完就过了,写二分条件写了半天。不要用数组储存hash值,会爆,开vector就行。
代码:
#include<stack> #include<vector> #include<queue> #include<set> #include<cstring> #include<string> #include<sstream> #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define ll long long #define ull unsigned long long using namespace std; const int maxn = 100000+10; const int seed = 131; const int MOD = 100013; const int INF = 0x3f3f3f3f; vector<ull> ha[maxn]; int len[maxn]; char s[10005]; void HASH(int x){ len[x] = strlen(s + 1); ha[x].clear(); ha[x].push_back(0); for(int i = 1; i <= len[x]; i++){ ha[x].push_back(ha[x][i - 1] * seed + s[i]); } } int main(){ int T, Case = 1; scanf("%d", &T); while(T--){ int n; scanf("%d", &n); for(int i = 1;i <= n;i++){ scanf("%s", s + 1); HASH(i); } int q; printf("Case %d:\n", Case++); scanf("%d", &q); while(q--){ int u, v; scanf("%d%d", &u, &v); int l = 1, r = min(len[u], len[v]), m, ans = 0; while(l <= r){ m = (l + r) / 2; if(ha[u][m] == ha[v][m]){ l = m + 1; ans = m; } else r = m - 1; } printf("%d\n", ans); } } return 0; } /* Sample Input 2 5 daffodilpacm daffodiliupc distancevector distancefinder distinctsubsequence 4 1 2 1 5 3 4 4 5 2 acm icpc 2 1 2 2 2 Sample Output Case 1: 8 1 8 4 Case 2: 0 4 */