离谱WA on 8 10玄关求调
查看原帖
离谱WA on 8 10玄关求调
1286488
Xuan3579楼主2024/9/8 09:09
#include<bits/stdc++.h>
using namespace std;

#define ull unsigned long long

const int mod1 = 917120411;
const int mod2 = 687840301;
const int base = 13331;
//const int M = 1503;
const int N = 1e6 + 3;

ull p[N];

int l[N], r[N];

int read(){
	int x = 1, s = 0;
	char ch = getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')x=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
	return s *x;
}

void print(int x, int y){
	for(int i = x; i < y; i++)
		cout << (l[i] == -1 ? -1 : i - l[i]) <<" ";
	cout << '\n';
}

map<string, int> M;
vector<string> a1, a2;

int main(){
	for(string t;cin >> t, t != "$";)
        a1.push_back(t);
    for(string t;cin >> t, t != "$";)
        a2.push_back(t);
	int k1 = a1.size(), k2 = a2.size();
	p[0] = 1;
	for(int i = 1; i < k1; i++)
		p[i] = p[i - 1] * base;
	for(int i = 0; i < k1; i++){
		if(!M.count(a1[i])) l[i] = -1;
		else l[i] = M[a1[i]];
		M[a1[i]] = i;
	}
	M.clear();
	for(int i = k1 - 1; i >= 0; i--){
		if(!M.count(a1[i])) r[i] = -1;
		else r[i] = M[a1[i]];
		M[a1[i]] = i;
	}
	M.clear();
//	print(0, k2);
//	for(int i = 0; i < k1; i++)
//		cout << r[i] <<" ";
    ull h1 = 0, h2 = 0;
	for(int i = 0; i < k2; i++){
		ull w;
		if(!M.count(a2[i]))w = -1;
		else  w = i - M[a2[i]];
		M[a2[i]] = i;
		h2 = h2 * base + w;
		h1 = h1 * base + (l[i] == -1 ? -1 : i - l[i]);
	}
	M.clear();
	if(h1 == h2)cout << 0, exit(0);
//	cout << " h2 = " << h2 <<'\n';
//	cout << " h1 = " << h1 <<'\n';
	for(int i = k2; i < k1; i++){
//		cout << i - k2 + 1 << '\n';
		int op = r[i - k2];
		if(op <= k2){
			h1 = h1 - (l[op] == -1 ? -1 : op - l[op]) * p[i - op - 1];
			h1 = h1 - p[i - op - 1];
		}
		l[op] = -1;
//		print(i - k2 + 1, i + 1);
		h1 = h1 * base + (l[i] == -1 ? -1 : i - l[i]);
		h1 = h1 - (l[i - k2] == -1 ? -1 : i - l[i]) * p[k2];
//		cout << " h1 = " << h1 <<'\n';
		if(h1 == h2)cout << i - k2 + 2, exit(0);
	}
	return 0;
}
2024/9/8 09:09
加载中...