Codevs1013 單詞背誦

不知道哪根筋抽了,用map寫Hash,long long就可以滿足Hash了,開心!!
//Codevs3013 單詞背誦 
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
const int maxn=1000+10,maxm=100000+10,INF=maxm;
int n,m,ans1=0,ans2=INF;
char c[20];
bool vis[maxn];
int essay[maxm],tot[maxn],e=0;
map<long long,int> D;
map<long long,int> :: iterator it;

long long num1,num2;
void init1() {
	num1=0;num2=1;
	for(int i=strlen(c)-1;i>=0;--i) {
		num1+=(c[i]-'a'+1)*num2;
		num2=num2*26;
	}
	if(D.find(num1)==D.end())
		D.insert(pair<long long,int>(num1,++e));
}

int x;
void init2(int pos) {
	num1=0;num2=1;
	for(int i=strlen(c)-1;i>=0;--i) {
		num1+=(c[i]-'a'+1)*num2;
		num2=num2*26;
	}
	it=D.find(num1);
	if(it!=D.end()) {
		x=it->second;
		if(vis[x]==0) ans1++;
		vis[x]=1;essay[pos]=x;
	}
	else essay[pos]=-1;
}

void doit() {
	int sum=0,j=0;
	for(int i=1;i<=m;++i) {
		if(i>1) {
			if(tot[essay[i-1]]==1) sum--;
			tot[essay[i-1]]--;
		}
		if(sum>=ans1) {
			ans2=min(ans2,j-i+1);
			continue;
		}
		for(j=j+1;j<=m;++j) {
			if(essay[j]==-1) continue;
			tot[essay[j]]++;
			if(tot[essay[j]]==1) {
				sum++;
				if(sum>=ans1) {
					ans2=min(ans2,j-i+1);
					break;
				}
			}
		}
	}
	cout<<ans2;
}

int main() {
	scanf("%d",&n);gets(c);
	for(int i=1;i<=n;++i) {
		gets(c);init1();
	}
	scanf("%d",&m);gets(c);
	for(int i=1;i<=m;++i) {
		gets(c);init2(i);
	}
	cout<<ans1<<"\n";
	if(ans1>1) doit();
	else cout<<ans1;
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章