题目pdf:https://icpcarchive.ecs.baylor.edu/external/60/6047.pdf
题目大意:给定n个字符串,任意两个组成的字符串为回文串的组合有多少种情况。
打个哈希表,O(n*len)检验即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
unsigned int hash[1010], ha = 137;
char input[1010][510];
int l[1010], r[1010], len[1010];
int t, n;
int main() {
hash[0] = 1;
for(int i = 1; i < 1010; i++) {
hash[i] = hash[i - 1] * ha;
}
scanf("%d", &t);
for(int count = 1; count <= t; count++) {
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%s", input[i]);
len[i] = strlen(input[i]);
for(int j = 0; j < len[i]; j++) {
l[i] += hash[j] * (int)(input[i][j] - 'a');
r[i] += hash[j] * (int)(input[i][len[i] - j - 1] - 'a');
}
}
int ans = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(i == j) continue;
if(l[i] + l[j] * hash[len[i]] == r[j] + r[i] * hash[len[j]])
ans++;
}
}
printf("Case #%d: %d\n", count, ans);
}
return 0;
}