题目:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1282
思路:计算出所有指针的间隔,然后用最小表示法表示,然后哈希用map统计
代码:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N = 505;
const int hs = 19;
int n,m,p;
int a[N];
ull Hash[N*N],x[N]={1};
map<ull,int> mp;
int get_min()
{
int i = 0,j = 1,k = 0;
while(i < m && j < m && k < m)
{
int t= a[(i+k)%m] - a[(j+k)%m];
if(t == 0)
k++;
else
{
if(t > 0)
i += k+1;
else
j += k+1;
if(i == j)
j++;
k = 0;
}
}
return i < j ? i : j;
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
int ans = 0;
for(int i = 1;i <= n;i++)
{
for(int j = 0;j < m;j++)
scanf("%d",&a[j]);
sort(a,a+m);
a[m] = a[0] + p;
for(int j = 0;j < m;j++)
a[j] = a[j+1] - a[j];
int k = get_min();
ull s = 1;
for(int j = 0;j < m;j++)
s = s*hs + a[(j+k)%m];
ans += mp[s];
mp[s]++;
}
printf("%d\n",ans);
return 0;
}