单链表
置空表 插入数据到头节点
#include"bits/stdc++.h"
using namespace std;
const int maxn=1002;
int num[maxn];
int main(){
int n,m;
while(~scanf("%d %d",&n,&m)!=EOF)
{
memset(num,0,sizeof num);
for(int i=1;i<=n;i++)
{
num[i]=i;
}
while(m--){
next_permutation(num,num+n);//每更新一次 新的排列序列就会替代之前的排列
}
} for(int i=1;i<n;i++)
{
cout<<num[i]<<" ";
}
cout<<num[n];
return 0;
}
单调栈
本质:维护一个严格单调上升/下降的序列
int n;
int stk[N],tt;//tt表示栈的大小
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
while(tt && stk[tt]>=x)tt--;//栈不为空
if(tt)cout<<stk[tt]<<endl;
else cout<<"-1"<<endl;
stk[++tt]=x;
}
}
trie树
基础知识:
字符串hash
!基础知识:
```#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const int N=1e5+10,P=131;//131 13331
ULL p[N],h[N];
char str[N];
int n,m;
ULL query(int l,int r){
return h[r]-h[l]*p[r-l+1];
}
int main()
{
scanf("%d%d%s",&n,&m,str);
p[0]=1;
for(int i=0;i<n;i++)
{
p[i+1]=p[i]*P;//定义多少次方
h[i+1]=h[i]*P+str[i];
}
while(m--){
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
if(query(l1,r1)==query(l2,r2))printf("Yes\n");
else printf("No\n");
}return 0;
}