3555: [Ctsc2014]企鹅QQ

先Hash一下。

删掉某一位,重新Hash,然后排序,扫一遍就好了。

感觉人品用光了,数组大小205打成25,WA了4次。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=30000+5;
typedef unsigned long long ll;
ll hash1[N][205],hash2[N][205],rehash[N];
int n,l,s;
char ch[205];
void calc(int x){
	for(int i=1;i<=l;i++)
	hash1[x][i]=hash1[x][i-1]*233+ch[i];
	for(int i=l;i>=1;i--)
	hash2[x][i]=hash2[x][i+1]*213+ch[i];
}
int main(){
	scanf("%d%d%d",&n,&l,&s);
	for(int i=1;i<=n;i++){
		scanf("%s",ch+1);
		calc(i);
	}
	int ans=0;
	for(int i=1;i<=l;i++){
		for(int j=1;j<=n;j++)
		rehash[j]=hash1[j][i-1]*741+hash2[j][i+1]*886;
		sort(rehash+1,rehash+1+n);
		int now=1;
		for(int i=2;i<=n;i++)
		if(rehash[i]==rehash[i-1])ans+=now,now++;
		else now=1;
	}
	printf("%d",ans);
	return 0;
}


你可能感兴趣的:(3555: [Ctsc2014]企鹅QQ)