记录编号 95277 评测结果 AAAAAAAAAA
题目名称 [USACO Dec05]可疑的斑点 最终得分 100
用户昵称 GravatarChenyao2333 是否通过 通过
代码语言 C++ 运行时间 0.086 s
提交时间 2014-04-04 22:22:42 内存使用 2.60 MiB
显示代码纯文本
#include<stdio.h>
#include<iostream>


using namespace std;
const int MAXN=100000+10;

typedef unsigned long long ULL;
const ULL X=204801569;

int N,K,S,MN;
int s_n[MAXN];
int k_s[MAXN];

ULL x_z[MAXN];
void cal_x_z(){
	x_z[0]=1;
	for(int i=1;i<MN;i++){
		x_z[i]=x_z[i-1]*X;
	}
}

inline ULL add_num(ULL h,ULL del,ULL add,int size){
	h-=del*x_z[size];
	h*=X;
	h+=add*X;
	return h;
}

void read(){
	scanf("%d %d %d",&N,&K,&S);MN=K+10;
	for(int i=1;i<=N;i++)scanf("%d",&s_n[i]);
	for(int i=1;i<=K;i++)scanf("%d",&k_s[i]);
}

int ans_n[MAXN];

ULL cal_hash(int *arr,int a,int b){
	ULL ans=0;
	for(int i=a;i<=b;i++){
		ans=add_num(ans,0,arr[i],i-a-1);
	}
	return ans;
}

int s_num[30]={0};
int s_rank[30]={0};
int rank[MAXN]={0};

void cal_s_rank(){
	int r=1;
	for(int i=1;i<=S;i++){
		if(s_num[i])s_rank[i]=r++;
	}
}

void cal_rank(int a,int b){
	for(int i=a;i<=b;i++){
		rank[i]=s_rank[s_n[i]];
	}
}

void work(){
	read();
	cal_x_z();
	int ans=0;
	ULL Ha=cal_hash(k_s,1,K);
	ULL Hb=0;
	for(int i=1;i<=K;i++){
		int s=s_n[i];
		s_num[s]++;
	}
	cal_s_rank();
	cal_rank(1,K);
	Hb=cal_hash(rank,1,K);
	if(Ha==Hb){
		ans_n[ans++]=1;
	}
	for(int i=1;i+K<=N;i++){
		int x=s_n[i];
		int y=s_n[i+K];
		rank[i+K]=s_rank[y];
		s_num[x]--;s_num[y]++;
		//rank[x]--;rank[y]++;
		if(s_num[x]==0 || s_num[y]==1 || !y){
			cal_s_rank();
			y=s_rank[s_n[i+K]];
			rank[i+K]=y;
			cal_rank(i+1,i+K);		
			Hb=cal_hash(rank,i+1,i+K);
		}else{
			Hb=add_num(Hb,s_rank[x],s_rank[y],K);
		}
		if(Ha==Hb){
			ans_n[ans++]=i+1;
		}
	}
	cout<<ans<<endl;
	for(int i=0;i<ans;i++){
		printf("%d\n",ans_n[i]);
	}
}

void open(){
	//freopen("in.txt","r",stdin);
	freopen("cpattern.in","r",stdin);
	freopen("cpattern.out","w",stdout);
}

int main(){
	open();
	work();
}