寒假训练第一场

//eli拿到了一个仅由小写字母组成的字符串。
//她想截取一段连续子串,这个子串包含至少 k个相同的某个字母。
//她想知道,子串的长度最小值是多少?
//注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。
//例如:对于字符串“arcaea”而言,“arc”、“rcae”都是其子串。而“car”、“aa”则不是它的子串。
#include"bits/stdc++.h"
using namespace std;
int flag[26]={0};//标记当前字符串中各个字母的个数 
int main(){
	int n,k;
	string a;
	cin>>n>>k>>a;
	int ans=-1,cnt=0,l=0;
	queue<char>q;//用队列的特性模拟过程 ,也可以用双指针的方法 
	for(int i=0;i<n;i++){
		q.push(a[i]);
		flag[a[i]-'a']++;
		while(flag[a[i]-'a']==k){//一找到有某个字母个数 == k 的连续子串,更新长度,直到不等于 k 
			if(ans==-1)ans=q.size(); 
			else ans=min(ans,(int)q.size());
			flag[q.front()-'a']--;//队头的字母的个数要减 1 
			q.pop();
		}
	}
	cout<<ans<<endl;
return 0;
} 
//rin最近喜欢上了数论。
//然而数论实在太复杂了,她只能研究一些简单的问题。
//这天,她在研究正整数因子个数的时候,想到了一个“快速迭代”算法。设fx为 x的因子个数,将 f迭代下去,rin猜想任意正整数最终都会变成 2。
//例如:f12=6,f6=4,f4=3,f3=2。
//她希望你帮她验证一下。她会给你一个正整数 n,让你输出它在迭代过程中,第一次迭代成 2的迭代次数。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f(ll x){             //求x的因子个数
    ll i,res=0;
    for(i=1;i*i<x;i++){//只需要遍历到sqrt(x) 即可,降低复杂度 
        if(x%i==0)res+=2;
    }
	if(i*i==x)res++;//例如4的因子是1 2 4,有三个因子,因子2只算一次 

    return res; 
}
int main(){
    ll cnt=0,n;
    cin>>n;
    while(n!=2){
    	n=f(n);//迭代 
		cnt++;
	}
    cout<<cnt;
}
//nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
//她想到了这样一个问题:
//对于一个 “01”串而言,每次操作可以把 0 字符改为 1 字符,或者把 1 字符改为 0 字符。所谓 “01”串,即只含字符 0 和字符 1 的字符串。
//nozomi有最多 k 次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
//nozomi想问问聪明的你,这个子串的长度最大值是多少?
//注: k 次操作机会可以不全部用完。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e6+10,M=N*400,mod=1e9+7;
LL n,m;
int a[N];
int s[N];
bool check(int x){
    for(int i=x,j=0;i<=n;i++,j++){
        int cnt1=s[i]-s[j];//1的个数 
        int cnt0=x-k;//0的个数 
        if(cnt1<=m||cnt0<=m)return 1;
    }
    return 0;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%1d",&a[i]);
        s[i]=s[i-1]+a[i];
        cout<<s[i]<<endl; 
    }
    int ans=0;
    int l=1,r=n;
    while(l<=r){//二分法检查不同长度的字符串 
        int mid=(l+r)/2;
        if(check(mid))ans=mid,l=mid+1;
        else r=mid-1;
    }
    cout<<ans;
    return 0;
}
//honoka最近在研究三角形计数问题。
//她认为,满足以下三个条件的三角形是“好三角形”。
//1.三角形的三个顶点均为格点,即横坐标和纵坐标均为整数。
//2.三角形的面积为 1。
//3.三角形至少有一条边和 x 轴或 y 轴平行。
//honoka想知道,在平面中选取一个大小为 1 的矩形格点阵,可以找到多少个不同的“好三角形”?
//由于答案可能过大,请对 1e9+7 取模。
#include"bits/stdc++.h"
using namespace std;
int mod=1e9+7;
int main(){
    long long ans=0;
    long long n,m;//如果 n 和 m 的大小在int极限范围,而且这两者还需要进行运算,设为ll 
    cin>>n>>m;
    //有一条边和 y 平行 + 一条边和 x 平行 且 一条边和 y 平行的好三角形 
    ans=(ans+2*(m-2)*(m-1)%mod*(n-2))%mod;//中间需要 %mod 以防数字太大 
    ans=(ans+2*(m-2)*(m-2)%mod*(n-1))%mod;
    //只累加有一条边和 x 轴平行的好三角形 
    ans=(ans+2*n*(n-1)%mod*(m-2))%mod; 
    ans=(ans+2*n*(n-2)%mod*(m-1))%mod;
    cout<<ans%mod<<endl;
}
发布了59 篇原创文章 · 获赞 0 · 访问量 1666

猜你喜欢

转载自blog.csdn.net/qq_40409416/article/details/104380501