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;
}