AcWing 826. 单链表
1.题意:
2.题解:
e[i],ne[i]存储当前下标为i的val和指向的下一个值,idx存储当前已经用到的点,
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int e[N],ne[N],idx,head;
void init(){
idx=0;
head=-1;
memset(ne,-1,sizeof ne);
}
//插入到头节点后面
void add_to_head(int x){
e[idx]=x;
ne[idx]=head;
head=idx;
idx++;
}
//插入到k节点后面
void add(int k,int x){
e[idx]=x;
ne[idx]=ne[k];
ne[k]=idx;
idx++;
}
//删除第k节点后面的数字
void remove(int k){
ne[k]=ne[ne[k]];
}
//删除头节点
void remove_head(){
head=ne[head];
}
int main(){
int m;
cin>>m;
init();
char op;
int x,k;
for(int i=1;i<=m;i++){
// H x,表示向链表头插入一个数 x。
// D k,表示删除第 k 个插入的数后面的数(当 k 为 0 时,表示删除头结点)。
// I k x,表示在第 k 个插入的数后面插入一个数 x(此操作中 k 均大于 0)。
cin>>op;
if(op=='H'){
cin>>x;
add_to_head(x);
}else if(op=='D'){
cin>>k;
if(k==0)
remove_head();
else
remove(k-1);
}else if(op=='I'){
cin>>k>>x;
add(k-1,x);
}
}
for(int i=head;i!=-1;i=ne[i]){
cout<<e[i]<<" ";
}
cout<<endl;
}
AcWing 840. 模拟散列表
1.题意:
2.题解:
将范围是-1e9~1e9的数字,压缩到1e5内
3.ac代码:
开放寻址法
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+3,null=0x3f3f3f3f;//null要取一个不属于x范围里头的数字
int h[N];
int find(int x){//返回的是不管x在不在数组里,都应该在数组里存储的位置
int k=(x%N+N)%N;
while(h[k]!=null&&h[k]!=x){
k++;
if(k==N) k=0;
}
return k;
}
int main(){
memset(h,null,sizeof h);//!!!!
int n;
char c;
int x;
cin>>n;
for(int i=1;i<=n;i++){
cin>>c>>x;
int k=find(x);
if(c=='I'){
h[k]=x;
}else{
if(h[k]!=null){
cout<<"Yes"<<endl;
}else
cout<<"No"<<endl;
}
}
}
拉链法
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+3;//必须是质数,该题里范围是1e5,所以算出大于1e5的第一个质数是1e5+3
int e[N],ne[N],h[N],idx;
void insert(int x){
int k=(x%N+N)%N;//保证余数是正数,因为x范围是从-1e9~1e9,不能先+N再余除,如果x是-1e9仍会是负数
e[idx]=x;
ne[idx]=h[k];
h[k]=idx;
idx++;
}
void query(int x){
int k=(x%N+N)%N;
for(int i=h[k];i!=-1;i=ne[i]){
if(e[i]==x){
cout<<"Yes"<<endl;
return ;
}
}
cout<<"No"<<endl;
}
int main(){
memset(ne,-1,sizeof ne);
memset(h,-1,sizeof h);//!!!
int n;
cin>>n;
char op;
int x;
for(int i=1;i<=n;i++){
cin>>op>>x;
if(op=='I'){
insert(x);
}else{
query(x);
}
}
}
AcWing 841. 字符串哈希
1.题意:
2.题解:
不能映射成0
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const int N=1e5+10,P=131;
int h[N],p[N];
char s[N];
int get(int r,int l){
return h[r]-h[l-1]*p[r-l+1];
}
int main(){
int n,m;
cin>>n>>m;
cin>>s+1;
p[0]=1;
for(int i=1;i<=n;i++){
p[i]=p[i-1]*P;
h[i]=h[i-1]*P+s[i];
}
int l1,r1,l2,r2;
for(int i=1;i<=m;i++){
cin>>l1>>r1>>l2>>r2;
if(get(r1,l1)==get(r2,l2)){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
}