[Ybtoj Chapitre 7 Exemple 4] Récitation de mots [Hash]

Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici


Idées de résolution de problèmes

Pensez à passer à la fois les mots à mémoriser et les mots de l'article à travers H ash HashH a s h est transformé enhachage de hachageh a s h valeur, puis vous pouvez trouver directement le nombre maximum de mots à mémorisermaxn maxnm a x n .
Pour la deuxième question, considérez la méthode de la règle:

  1. Initialiser l = r = ml = r = ml=r=m ; (Vous pouvez commencer à partir de 0)
  2. Chaque fois lll Déplacer vers la gauche, s'il s'agit d'un mot à réciter, alorsnum + + num ++n u m++
  3. Si num == maxn num == maxnn u m==m a x n , considérez si r peut être déplacé vers la gauche (les mots à mémoriser ne peuvent pas être déplacés), puis mettez à jour la réponseans = min (ans, r - l) ans = min (ans, rl)ans=m i n a n s r-l ) Enfin annulerrrLe mot à la position r , voir le code pour plus de détails. .

Code

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

const int p=131,mod=1000007;

int n,m,a[1010],b[100010],v[2000000],use[2000000],vv[2000000],maxn,num,ans=2147483600,r;
string  x;

int hash(string s)
{
    
    
	int cnt=0;
	for(int i=0;i<s.size();i++)
	{
    
    
		cnt=(cnt*p+s[i])%mod;
	}
	return cnt;
}

int main(){
    
    
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>x;
		a[i]=hash(x);
		v[a[i]]=1;
	}	
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
    
    
		cin>>x;
		b[i]=hash(x);
		if(v[b[i]]&&!use[b[i]])
		{
    
    
			maxn++;
			use[b[i]]=1;
		}
	}
	if(maxn==0){
    
    
		printf("0\n0");
		return 0;	
	}
	else printf("%d\n",maxn);
	r=0;
	for(int l=1;l<=m;l++)
	{
    
    
		while(num<maxn&&r<m)
		{
    
    
			r++;
			if(v[b[r]])
			{
    
    	
				if(vv[b[r]]==0)
					num++;
				vv[b[r]]++;
			}
		}
		if(num==maxn)
		{
    
    
			while(!v[b[l]])
				l++;
			ans=min(ans,r-l+1);
			
			if(vv[b[l]]>=1)
			{
    
    
				if(vv[b[l]]==1)
					num--;
				vv[b[l]]--;
			}
		}
	}
	printf("%d",ans);
}



Je suppose que tu aimes

Origine blog.csdn.net/kejin2019/article/details/114334547
conseillé
Classement