目录
一、哈希
1、字符统计
/*字符统计*/
#include<bits/stdc++.h>
using namespace std;
void _solve(){
string s;
int hash[256]={0};
cin>>s;
for(int i=0;i<s.size();i++){
hash[s[i]]++;//统计字符出现的次数
}
int _max=0;
char str[256];;
int strSize=0;
for(char a='A';a<='Z';a++){
if(hash[a]>_max){//统计出现次数最多的字符
_max=hash[a];
strSize=0;
str[strSize++]=a;
}
else if(hash[a]==_max){//出现最多次数一样的情况
str[strSize++]=a;
}
}
str[strSize]='\0';//将字符数组转换为字符串
cout<<str<<endl;
}
int main(){
int T=1;
//cin>>T;
while(T--){
_solve();
}
return 0;
}
2、字符串统计
/*字符串统计*/
#include<bits/stdc++.h>
using namespace std;
void _solve(){
map<string,int> mp;
int n;
cin>>n;
for(int i=0;i<n;i++){
string s;
cin>>s;
mp[s]=1;//将s插入到哈希表(map)中,利用互异性
}
cout<<mp.size()<<endl;
}
int main(){
int T=1;
//cin>>T;
while(T--){
_solve();
}
return 0;
}
3、优质数对
/*优质数对*/
//a[i]==b[j]
//a[j]==b[i]
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 1000000001;
#define MAX 200001
int a[MAX],b[MAX];
map<ll,int>h;
int n;
void _solve(){
ll len=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int j=0;j<n;j++)
cin>>b[j];
for(int i=0;i<n;i++){
ll y=b[i]*N+a[i];
len+=h[y];
ll x=a[i]*N+b[i];
h[x]++;
}
cout<<len<<endl;
}
int main(){
int T=1;
//cin>>T;
while(T--){
_solve();
}
return 0;
}
二、滑动窗口
1、挑子串
/*挑子串*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 2005
int a[MAX];
int hd_ck(int n,int k,int a[]){
int sum=0,ans=0;
int i=0,j=-1;
while(j++<n-1){
sum+=a[j];
while(sum>=k){
ans+=n-j;
sum-=a[i];
i++;
}
}
return ans;
}
void _solve(){
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
a[i]=(a[i]>=m?1:0);
}
int ans=hd_ck(n,k,a);
cout<<ans<<endl;
}
int main(){
int T=1;
//cin>>T;
while(T--){
_solve();
}
return 0;
}
2、最长子串
/*最长子串*/
#include<bits/stdc++.h>
using namespace std;
int hd_ck(int n,int k,const string &a){
int i=0,j=-1;
int nums[256]={0};
int ans=0;
while(j++<n-1){
nums[a[j]]++;
while(nums[a[j]]>k){
nums[a[i]]--;
i++;
}
ans=max(ans,j-i+1);
}
return ans;
}
void _solve(){
string s;
int k,ans=0;
cin>>s>>k;
ans=hd_ck(s.size(),k,s);
cout<<ans<<endl;
}
int main(){
int T=1;
//cin>>T;
while(T--){
_solve();
}
return 0;
}
3、全部都有的子序列
/*全部都有的子序列*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
int a[MAX];
int hd_ck(int n,int *a){
int i=0,j=-1;
int nums[1001]={0};
int shu=0,len=0;
int _min=n;
for(int i=0;i<n;i++){
nums[a[i]]++;
if(nums[a[i]]==1){
len++;
}
}
memset(nums,0,sizeof(nums));
while(j++<n-1){
if(++nums[a[j]]==1){
shu++;
}
while(shu==len){
_min=min(_min,j-i+1);
if(--nums[a[i]]==0){
shu--;
}
i++;
}
}
return _min;
}
void _solve(){
int n,ans=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
ans=hd_ck(n,a);
cout<<ans<<endl;
}
int main(){
int T=1;
//cin>>T;
while(T--){
_solve();
}
return 0;
}