unordered_map<char, int> mp
时间: 2024-06-17 21:02:09 浏览: 154
unordered_map<char, int> mp是一个C++ STL标准库中的容器,它可以将字符类型char映射到整数类型int上,实现类似字典的功能。其中,char为关键字(键),int为值。它的特点是能够在常数时间内(平均O(1))完成查找、插入和删除操作,因此非常适合用来存储大量的键值对,并且在需要快速查找或统计某个键出现次数的场景下具有很大的优势。此外,unordered_map还支持迭代器等基本操作,具有较好的灵活性和扩展性。
相关问题
优化这段代码的时间 C++ 实现 #include <bits/stdc++.h> using namespace std; char s[10000001]; int main() { scanf("%s",s+1); int n=strlen(s+1),ans_len=0,ans_pos=0; int l=1,r=0; map<char,int> mp; while(r<n) { while(r<n&&mp[s[r+1]]<1) { mp[s[++r]]=1; } if(r-l+1>ans_len) { ans_len=r-l+1; ans_pos=l; } else if(r-l+1==ans_len) { ans_pos=max(ans_pos,l); } mp[s[l++]]--; } for(int i=ans_pos;i<ans_pos+ans_len;i++) { cout<<s[i]; } cout<<endl; }
以下是进一步优化后的代码:
```c++
#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_map> // 使用 unordered_map 代替 map
using namespace std;
const int MAXN = 10000001;
char s[MAXN];
int main() {
scanf("%s",s);
int n=strlen(s),ans_len=0,ans_pos=0;
int l=1,r=0;
unordered_map<char,int> mp; // 使用 unordered_map 来优化查找速度
while(r<n) {
while(r<n&&mp[s[r+1]]<1) {
mp[s[++r]]=1;
}
if(r-l+1>ans_len) {
ans_len=r-l+1;
ans_pos=l;
} else if(r-l+1==ans_len) {
ans_pos=max(ans_pos,l);
}
mp[s[l++]]--;
}
for(int i=ans_pos;i<ans_pos+ans_len;i++) {
cout<<s[i];
}
cout<<endl;
return 0;
}
```
主要的优化点有:
1. 使用 `unordered_map` 来代替 `map`,因为 `unordered_map` 的查找速度比 `map` 快;
2. 增加注释,以提高代码的可读性。
通过这些优化,可以进一步提高代码的运行速度。
#include <bits/stdc++.h> using namespace std; const int mxn=3e1+5; unordered_map<string,int>mp; int n,m; char s[1000],t[1000]; double x,dis[mxn][mxn]; void floyd() { for(int k=0;k<n;k++) for(int i=0;i<n;i++) { if(dis[i][k]==0) continue; for(int j=0;j<n;j++) dis[i][j]=max(dis[i][j],dis[i][k]*dis[j][k]); } } int main() { int cnt=0; while(scanf("%d",&n)==1) { if(n==0) break; for(int i=0;i<mxn;i++) for(int j=0;j<mxn;j++) dis[i][j]=i==j; mp.clear(); for(int i=1;i<=n;i++) { scanf("%s",s); mp[s]=mp.size(); } scanf("%d",&m); for(int i=i;i<=m;i++) { scanf("%s%lf%s",s,&x,t); if(mp.count(s)==0||mp.count(t)==0) continue; dis[mp[s]][mp[t]]=x; } floyd(); int sum=0; for(int i=0;i<n;i++) sum|=dis[i][i]>1; printf("Case %d: %s\n", ++cnt, sum?"Yes":"No"); } return 0; }这个代码为什么n只读取一次
这段代码中的`while(scanf("%d",&n)==1)`是一个循环条件,只有当读取到一个整数并且成功赋值给变量n时,循环才会执行。在这里,`scanf("%d",&n)`语句只会读取一次n的值,并且在每次循环开始时检查是否成功赋值。如果输入的值不是整数或者无法成功赋值给n,循环将终止。这样做是为了确保输入的n值正确,并且在输入结束时能够正确地退出循环。
阅读全文