相邻字符串hash具有唯一性
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
const int N=1000005;
const int M=27;
int f[M][M];
int n;
int a[N];
char b[N];
void solve()
{
for (int i=1; i<=n; i++)
{
char s[6];
scanf("%s", s);
int t=0;
for (int j=0; j<4; j++)
{
t=t*26+f[s[j]-'a'+1][s[j+1]-'a'+1];
}
a[t]=i;
b[t]=s[0];
}
for (int i=1; i<=n; i++){
char s[6];
scanf("%s", s);
int t=0;
for (int j=0; j<4; j++)
{
t=t*26+f[s[j]-'a'+1][s[j+1]-'a'+1];
}
printf("%d %d\n", a[t], f[s[0]-'a'+1][b[t]-'a'+1]);
}
}
void init()
{
scanf("%d", &n);
for (int i=1; i<=26; i++)
for (int j=1; j<=26; j++)
{
if (j>=i) f[i][j]=j-i;
else f[i][j]=26-i+j;
}
}
int main()
{
init();
solve();
return 0;
}