C,D求助
  • 板块学术版
  • 楼主wangshi
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/7/28 00:37
  • 上次更新2023/11/3 07:17:43
查看原帖
C,D求助
541553
wangshi楼主2023/7/28 00:37

C蒟蒻写的字符串哈希,但是一直不对,想问一下这个思路行不行,求出原串的哈希和全是0的和全是1串的哈希,每次通过加减算出排序后的,但是蒟蒻结果一直不对,

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<map>
#define ll long long
#define ull unsigned long long
using namespace std;
const int N=2e5+10,p=1e9+7;
typedef pair<int,int> PII;
ull h[N],h1[N],h2[N],base[N];
int n,m,sum[N];
ull check(int l,int r)
{
	ull ans=h[n]-h[r]*base[n-r]+h[l-1]-h[0]*base[l-1];
	int s2=sum[r]-sum[l-1];
	int s1=r-l+1-s2;
	if(s1) ans=ans+h1[l+s1-1]-h1[l-1]*base[s1];
	if(s2) ans=ans+h2[r]-h2[r-s2]*base[s2];
	return ans;
}
void solve()
{
	map<ull,bool> q; 
	string s;
	cin>>n>>m>>s;
	s=' '+s;base[0]=1;
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		base[i]=base[i-1]*p;
		h[i]=h[i-1]*p+s[i];
		h1[i]=h1[i-1]*p+'0';
		h2[i]=h2[i-1]*p+'1';
		if(s[i]=='1') sum[i]++;
		sum[i]+=sum[i-1];
	}
	while(m--)
	{
		int l,r;
		cin>>l>>r;
		cout<<check(l,r)<<endl;
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int t;
	cin>>t;
	while(t--)
		solve();
	return 0;
}


蒟蒻先睡了,明早来看

D题一直Wa4,求hack

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e5+10;
typedef pair<int,int> PII;
void solve()
{
	int n;
	cin>>n;
	vector<int> a(n+1);
	for(int i=1;i<=n;i++)
		cin>>a[i];
	int s1=0,ans=0,f=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i]==0)
		{
			if(f) 
			{
				f=0;
				continue;
			}
			s1++;
			if(s1>=2||i==n)
				ans++;
		}
		else if(a[i]==1)
		{
			if(!f) ans++;
			if(s1&&a[i+1]==0) f=0;
			else f=1;
			s1=0;
		}
		else
		{
			if(!f) ans++;
			f=1,s1=0;
		}
	}
	cout<<ans<<'\n';
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int t=1;
	while(t--)
		solve();
	return 0;
}


2023/7/28 00:37
加载中...