数据结构
并查集
#include <bits/stdc++.h>
using namespace std;
int a[100010];
int root(int x)
{
if(x!=a[x])return a[x]=root(a[x]);
return x;
}
void merge_root(int x,int y)
{int i=root(x),j=root(y);
if(i!=j)
a[i]=root(a[j]);
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)a[i]=i;
char g;
int x,y;
while(m--)
{
cin>>g>>x>>y;
if(g=='M')merge_root(x,y);
else if(root(x)==root(y))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
单链表
#include <iostream>
using namespace std;
const int N = 100010;
int head, e[N], ne[N], idx;
void init()
{
head = -1;
idx = 0;
void add_to_head(int x)
{
e[idx] = x, ne[idx] = head, head = idx ++ ;
}
void add(int k, int x)
{
e[idx] = x, ne[idx] = ne[k], ne[k] = idx ++ ;
}
void remove(int k)
{
ne[k] = ne[ne[k]];
}
int main()
{
int m;
cin >> m;
init();
while (m -- )
{
int k, x;
char op;
cin >> op;
if (op == 'H')
{
cin >> x;
add_to_head(x);
}
else if (op == 'D')
{
cin >> k;
if (!k) head = ne[head];
else remove(k - 1);
}
else
{
cin >> k >> x;
add(k - 1, x);
}
}
for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
cout << endl;
return 0;
}
双链表
#include <iostream>
using namespace std;
const int N = 100010;
int m;
int e[N], l[N], r[N], idx;
void insert(int a, int x)
{
e[idx] = x;
l[idx] = a, r[idx] = r[a];
l[r[a]] = idx, r[a] = idx ++ ;
}
void remove(int a)
{
l[r[a]] = l[a];
r[l[a]] = r[a];
}
int main()
{
cin >> m;
r[0] = 1, l[1] = 0;
idx = 2;
while (m -- )
{
string op;
cin >> op;
int k, x;
if (op == "L")
{
cin >> x;
insert(0, x);
}
else if (op == "R")
{
cin >> x;
insert(l[1], x);
}
else if (op == "D")
{
cin >> k;
remove(k + 1);
}
else if (op == "IL")
{
cin >> k >> x;
insert(l[k + 1], x);
}
else
{
cin >> k >> x;
insert(k + 1, x);
}
}
for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';
cout << endl;
return 0;
}
手写栈
#include <bits/stdc++.h>
using namespace std;
int a[100010]={0};
int main()
{int T;
cin>>T;
int idex=0;
while(T--)
{
string s;
cin>>s;
if(s=="push"){int x;
scanf("%d",&x);
a[++idex]=x;
}
if(s=="query")cout<<a[idex]<<endl;
if(s=="pop")idex--;
if(s=="empty"){
cout<<(idex?"NO":"YES")<<endl;
}
}
return 0;
}
队列
#include <bits/stdc++.h>
using namespace std;
int a[100010]={0};
int main()
{int T;
cin>>T;
int idex=-1,h=-1;
while(T--)
{
string s;
cin>>s;
if(s=="push"){int x;
scanf("%d",&x);
a[++idex]=x;
}
if(s=="query")cout<<a[h+1]<<endl;
if(s=="pop")h++;
if(s=="empty"){
cout<<(idex-h>0?"NO":"YES")<<endl;
}
}
return 0;
}
单调栈
#include <bits/stdc++.h>
using namespace std;
int a[100010]={0};
int main()
{
stack<int>stk;
int n;
cin>>n;
while(n--)
{int x;
cin>>x;
while(!stk.empty()&&stk.top()>=x)stk.pop();
if(stk.empty())cout<<-1<<' ';
else cout<<stk.top()<<' ';
stk.push(x);
}
return 0;
}
单调队列
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int a[N],q[N];
int main()
{int n,k,head=0,tail=-1;
cin>>n>>k;
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{if(q[head]<i-k+1&&head<=tail)head++;
while(a[q[tail]]>a[i]&&head<=tail)tail--;
q[++tail]=i;
if (i >= k - 1) printf("%d ",a[q[head]]);
}
cout<<endl;
head=0;tail=-1;
for(int i=0;i<n;i++)
{if(q[head]<i-k+1&&head<=tail)head++;
while(a[q[tail]]<a[i]&&head<=tail)tail--;
q[++tail]=i;
if (i >= k - 1) printf("%d ",a[q[head]]);
}
cout<<endl;
return 0;
}
KMP
#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=1000010;
char p[N],s[M];
int ne[N],n,m;
int main()
{cin>>n>>p+1>>m>>s+1;
for(int i=2,j=0;i<=n;i++)
{
while(j&&p[i]!=p[j+1])j=ne[j];
if(p[i]==p[j+1])j++;
ne[i]=j;
}
for(int i=1,j=0;i<=m;i++)
{
while(j&&s[i]!=p[j+1])j=ne[j];
if(s[i]==p[j+1])j++;
if(j==n)
{
printf("%d ",i-n);
j=ne[j];
}
}
}