请求被hack
查看原帖
请求被hack
603121
LEWISAK楼主2024/4/25 11:03

拍了20000+组数据了

注意

  • 请不要告诉楼主他的做法非正解(坚持不写正解)

  • 请不要说代码T了(大概卡卡常就好了)

代码大体思路是a按照∗*分段

匹配时减掉??的hash值。

屎山代码:

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
map<int,int> ha;
map<int,int> hb;
map<int,map<int,int> > tong;
char t=' ',b[100100],text[100100]={' ','a','a','?'},fw=' ',a[100100];
int len[100100],lmx,cnt=1,n,num;
unsigned long long mi[101000];
signed main(){
//	freopen("in.in","r",stdin);
cin.tie(0);
cout.tie(0);
	mi[0]=1;
	for(int i=1;i<=100000;i++){
		mi[i]=mi[i-1]*13331;
	}
//	for(int i=1;i<=3;i++){
	while(1){
		t=getchar();
		a[++lmx]=t;
		if(fw==' '){
			fw=t;
		}
//		t=text[i];
		if(t==10){
			break;
		}
		if(t=='*'){
			tong[cnt][0]=num;
			num=0;
			cnt++;
			continue;
		}
		len[cnt]++;
		if(t=='?'){
			num++;
			tong[cnt][num]=len[cnt];
			ha[cnt]=ha[cnt]*13331;
			continue;
		}
		ha[cnt]=ha[cnt]*13331+t;
	}
	tong[cnt][0]=num;
	cin>>n;
//	n=114;
	for(int i=1;i<=n;i++){
		cin>>b+1;
		if(cnt==1){
			if(fw=='*'){
				cout<<"YES"<<endl;
				continue;
			}
			int flag=1;
			int zxc=strlen(b+1);
			for(int i=1;i<=zxc;i++){
				if(b[i]!=a[i]&&a[i]!='?'){
					cout<<"NO"<<endl;
					flag=0;
					break;
				}
			}
			if(flag){
				cout<<"YES"<<endl;
			}
			continue;
		}
//		b[0]=' ';b[1]='a';b[2]='a';b[3]='a';
		int cnt2=1;
		int flag=1;
		int zxc=strlen(b+1);
		for(int j=1;j<=zxc;j++){
			hb[j]=(hb[j-1]*13331+b[j]);
		}int j=0;
		for(;j<=zxc;j++){
			if(cnt2-1>cnt){
				flag=0;
			}
			if(!len[cnt2]&&j==0){
				cnt2+=flag;
				j--;
				continue;
			}
			if(j+len[cnt2]>zxc){
//				cout<<j;
				break;
			}
			unsigned long long t=hb[j+len[cnt2]]-hb[j]*mi[len[cnt2]];
//			cout<<j+len[cnt2]<<" "<<j<<" "<<t<<endl;
			for(int i=1;i<=tong[cnt2][0];i++){
//				cout<<len[cnt2]-(tong[cnt2][i])<<" "<<b[tong[cnt2][i]+j]<<endl;
				t-=mi[len[cnt2]-(tong[cnt2][i])]*b[tong[cnt2][i]+j];
			}
//			cout<<t<<endl<<ha[cnt2]<<endl;
			if(ha[cnt2]==t){
				cnt2+=flag;
			}
			else if(j==0&&fw!='*'){
				break;
			}
		}
//		cout<<cnt2;
		if(cnt2-1<=cnt||((j+len[cnt2])!=zxc+1)){
			cout<<"NO"<<endl;
		}
		else{
			cout<<"YES"<<endl;
		}
	}
//	string fw;
//	while(1){cin>>fw;}
	return 0;
}

违规紫杉

2024/4/25 11:03
加载中...