社区讨论

哈希+双指针 厌氧

P1381单词背诵参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhjseeir
此快照首次捕获于
2025/11/04 07:44
4 个月前
此快照最后确认于
2025/11/04 07:44
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,p=13331;
unsigned long long a[1000005],b[1000005],sf[1000005];
string s;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s;
		int l=s.size();
		s=" "+s;
		unsigned long long t=0;
		for(int j=1;j<=l;j++){
			t=t*p+s[j];
		} 
		a[i]=t;
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>s;
		int l=s.size();
		s=" "+s;
		unsigned long long t=0;
		for(int j=1;j<=l;j++){
			t=t*p+s[j];
		}
		b[i]=t;
		for(int j=1;j<=n;j++){
			if(b[i]==a[j]){
				sf[i]=1;
				break;	
			} 
			
		}
	}
	int ap[1000005],mx=0;
	for(int i=1;i<=m;i++){
		if(sf[i]){
			for(int j=1;j<=n;j++){
				if(b[i]==a[j]&&!ap[j]){
					ap[j]=1;
					mx++;
				} 
			}
		}
	}
	cout<<mx; 
	cout<<endl;
	if(mx==0){
		cout<<0;
		return 0;
	}
	int len=m+1,cnt[1000200],in=0,left=1;
	for(int r=1;r<=m;r++){
		if(sf[r]){
			for(int j=1;j<=n;j++){
				if(b[r]==a[j]){
					if(cnt[j]==0){
						in++;
					}
					cnt[j]++;
					break;
				}
			}
		}
		while(in==mx){
			int longg=r-left+1;
			len=min(len,longg);
			if(sf[left]&&left<=r){
				for(int j=1;j<=n;j++){
					if(b[left]==a[j]){
						cnt[j]--;
						if(cnt[j]==0){
							in--;
						}
						break;
					}
				}
			}
			left++;
		}
	}
	cout<<len;
}```

回复

4 条回复,欢迎继续交流。

正在加载回复...