P2216 [HAOI2007] 理想的正方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(单调队列)
#include<iostream>
#include<deque>
using namespace std;
int v[1005][1005],mi1[1005][1005],ma1[1005][1005],ma2[1005][1005],mi2[1005][1005];
int main(){
int a,b,n;
cin>>a>>b>>n;
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
cin>>v[i][j];
}
}
for(int i=0;i<a;i++){
deque<int>q,Q;
for(int j=0;j<b;j++){
if(!q.empty()&&j-q.front()>=n)q.pop_front();
if(!Q.empty()&&j-Q.front()>=n)Q.pop_front();
while(!q.empty()&&v[i][q.back()]>v[i][j])q.pop_back();
while(!Q.empty()&&v[i][Q.back()]<v[i][j])Q.pop_back();
q.push_back(j);
Q.push_back(j);
if(j>=n-1){
ma1[i][j]=v[i][Q.front()];
mi1[i][j]=v[i][q.front()];
}
}
}
for(int i=n-1;i<b;i++){
deque<int>q,Q;
for(int j=0;j<a;j++){
if(!q.empty()&&j-q.front()>=n)q.pop_front();
if(!Q.empty()&&j-Q.front()>=n)Q.pop_front();
while(!q.empty()&&mi1[q.back()][i]>mi1[j][i])q.pop_back();
while(!Q.empty()&&ma1[Q.back()][i]<ma1[j][i])Q.pop_back();
q.push_back(j);
Q.push_back(j);
if(j>=n-1){
ma2[j][i]=ma1[Q.front()][i];
mi2[j][i]=mi1[q.front()][i];
}
}
}
int ans=1e9+6;
for(int i=n-1;i<a;i++){
for(int j=n-1;j<b;j++){
ans=min(ma2[i][j]-mi2[i][j],ans);
}
}
cout<<ans<<endl;
}
P2034 选择数字 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(单调队列优化dp)
//删除范围内最小的数
#include<iostream>
#include<deque>
using namespace std;
const int N=100005;
long long a[N],dp[N];
int main(){
long long n,k;
cin>>n>>k;
long long sum=0;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
deque<int>q;
for(int i=0;i<n;i++){
if(i<=k){
dp[i]=a[i];
}
else {
dp[i]=dp[q.front()]+a[i];
}
if(!q.empty()&&i-q.front()>=k+1){
q.pop_front();
}
while(!q.empty()&&dp[q.back()]>dp[i])q.pop_back();
q.push_back(i);
}
long long mi=1e17+6;
for(int i=n-1;i>=n-k-1;i--){
mi=min((long long)mi,(long long)dp[i]);
}
cout<<sum-mi<<endl;
}
//固定右边界,只需求规定范围内的最小左边界
#include<iostream>
#include<deque>
using namespace std;
const int N=300005;
int a[N],s[N];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]+=s[i-1]+a[i];
}
deque<int>q;
q.push_back(0);
int ans=-1e10-6;
for(int i=1;i<=n;i++){
if(!q.empty()&&i-q.front()>=m+1)q.pop_front();
ans=max(ans,s[i]-s[q.front()]);
while(!q.empty()&&s[q.back()]>s[i])q.pop_back();
q.push_back(i);
}
cout<<ans<<endl;
}
138. 兔子与兔子 - AcWing题库(字符串hash)
#include<iostream>
#include<deque>
#include<map>
#include<string>
using namespace std;
#define ull unsigned long long
const int N=1000005;
int a[6];
ull f[N],p[N];
int w=131;
int main(){
string s;
cin>>s;
p[0]=1;
f[0]=0;
for(int i=0;i<s.size();i++){
f[i+1]=f[i]*131+s[i]-'a'+1;
p[i+1]=p[i]*131;
}
int m;
cin>>m;
for(int i=0;i<m;i++){
int l1,l2,r1,r2;
cin>>l1>>r1>>l2>>r2;
ull k=f[r1]-f[l1-1]*p[r1-l1+1];
ull k2=f[r2]-f[l2-1]*p[r2-l2+1];
if(k==k2){
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
}
P3370 【模板】字符串哈希 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(字符串hash模板)
#include<iostream>
#include<deque>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
#define ull unsigned long long
const int N=1000005;
ull a[10005],mod=100000000000000007;
int w=131;
ull h(string s){
ull ans=0;
for(int i=0;i<s.size();i++){
ans=(ans*131+s[i])%mod;
}
return ans;
}
int main(){
int n;
cin>>n;
int t=0;
for(int i=0;i<n;i++){
string s;
cin>>s;
a[t++]=h(s);
}
sort(a,a+n);
int ans=1;
for(int i=1;i<n;i++){
if(a[i]!=a[i-1])ans++;
}
cout<<ans<<endl;
}