社区讨论

求调

P5256[JSOI2013] 编程作业参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mlub3wp6
此快照首次捕获于
2026/02/20 11:04
2 周前
此快照最后确认于
2026/02/23 13:20
2 周前
查看原帖
有人能给错误样例吗
CPP
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=1000005;
const ull bs=131;
int T;
string s,t;
ull pb[N],hs[5][N];
map<char,int>mp;
int st[N],tt[N];
ull get(int i,int l,int r){
	if(l>r) return 0;
	return hs[i][r]-hs[i][l-1]*pb[r-l+1];
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	pb[0]=1;
	for(int i=1;i<N;i++) pb[i]=pb[i-1]*bs;
	cin>>T;
	while(T--){
		cin>>s>>t;
		int ss=s.size(),ts=t.size();
		s=' '+s;t=' '+t;
		for(int i=1;i<=ss;i++){
			if(s[i]>'Z') hs[1][i]=hs[1][i-1]*bs;
			else hs[1][i]=hs[1][i-1]*bs+s[i];
		}
		for(int i=1;i<=ts;i++){
			if(t[i]>'Z') hs[2][i]=hs[2][i-1]*bs;
			else hs[2][i]=hs[2][i-1]*bs+t[i];
		}
		mp.clear();
		for(int i=1;i<=ss;i++){
			st[i]=0;
			if(s[i]<='Z') continue;
			if(mp[s[i]])st[i]=i-mp[s[i]];
			mp[s[i]]=i;
		}
		mp.clear();
		for(int i=1;i<=ts;i++){
			tt[i]=0;
			if(t[i]<='Z') continue;
			if(mp[t[i]])tt[i]=i-mp[t[i]];
			mp[t[i]]=i;
		}
		for(int i=1;i<=ss;i++){
			hs[3][i]=hs[3][i-1]*bs+st[i];
		}
		for(int i=1;i<=ts;i++){
			hs[4][i]=hs[4][i-1]*bs+tt[i];
		}
		int fst=1,ans=0;
		for(int i=1;i+ts-1<=ss;i++){
			fst=max(fst,i);
			while(fst<=ss&&s[fst]<='Z') fst++;
			if(get(1,i,i+ts-1)!=get(2,1,ts)) continue;
			if(i+ts-1<fst||get(3,fst+1,i+ts-1)==get(4,fst-i+1,ts)){
				ans++;
			}
		}
		cout<<ans<<'\n';
	}
	return 0;
}

回复

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

正在加载回复...