• Codeforces Global Round 7


    题目链接:https://codeforces.com/contest/1326
    A 输出5…3即可,一定不会整除5和3

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=100010,inf=0x3f3f3f3f;
    #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int main()
    {
    	int t,n;
    	cin>>t;
    	while(t--)
    	{
    		cin>>n;
    		if(n==1) cout<<"-1"<<endl;
    		else 
    		{
    			cout<<5;
    			for(int i=1;i<n;i++)
    				cout<<3;
    			puts("");
    		}
    	}
    	return 0;
    }
    

    B 令a1=b1依次向后推即可

    #include<bits/stdc++.h>
     
    using namespace std;
    typedef long long ll;
    const int N=200010;
    const ll inf=0x3f3f3f3f3f3f3f3f;
    #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    ll a[N],b[N];
     
    int main()
    {
    	int t,n;
    	ll mn=-inf;
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i],b[i]=b[i-1]+a[i];
    	cout<<a[1]<<' ';
    	mn=a[1];
    	for(int i=2;i<=n;i++) 
    	{
    		cout<<a[i]+mn<<' ';
    		if(a[i]>0) mn=a[i]+mn;
    	}
    	return 0;
    }
    

    C 长度为n的数组被划分为k个区间,使k个区间的最大值的和最大,问最大的和和这样划分的方案数。
    最大的和一定是最大的k个数的和,找到这k个数所在的位置再求方案数,假定这k个数的位置是 l1,l2…lk。
    k个区间共需要k-1个隔板,下面看各个隔板的位置,第一个区间要包含l1不超过l2,第一个隔板有(l2-l1)种放法,那么类比第二个有(l3-l2)种放法…
    所以答案就出来了,和并不用取模…

    #include<bits/stdc++.h>
     
    using namespace std;
    typedef long long ll;
    const int N=200010,mod=998244353;
    #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,k,a[N];
    pair<int,int> b[N];
    int main()
    {
    	cin>>n>>k;
    	for(int i=1;i<=n;i++) cin>>a[i],b[i]={a[i],i};
    	sort(b+1,b+n+1);
    	vector<int> st;
    	ll sum=0,cnt=1;
    	for(int i=n;n-i<k;i--) st.push_back(b[i].second),sum+=b[i].first;
    	sort(st.begin(),st.end());
    	for(int i=1;i<st.size();i++) cnt=cnt*(st[i]-st[i-1])%mod;
    	cout<<sum<<' '<<cnt%mod;
    	return 0;
    }
    

    D 已知字符串s,将s的前缀和后缀拼接,输出所得的字符串是回文串的且长度最大的串
    首先找s的最大首尾逆序的长度,那么除了这两部分剩下的串中分别找首尾最长的回文串,选择两个中长度大的哪一个再与首位逆序的两部分拼接就可以,D2的数据范围比较大就需要快速的判断回文串 哈希就可以了(选择合适的质数,被卡了好几个…)

    #include<bits/stdc++.h>
     
    using namespace std;
    typedef long long ll;
    const int N=2000010,mod=1e9+7;
    typedef unsigned long long ull;  
    const ll p=233;
    #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,t,k;
    string s;
     
    ll po[N];
    void init()
    {
    	po[0]=1;
    	for(int i=1;i<N;i++)
    		po[i]=po[i-1]*p%mod;
    	return ;
    }
    int main()
    {
    	init();
    	cin>>t;
    	while(t--)
    	{
    		cin>>s;
    		int l=-1,len1,len2;
    		for(int i=0;i<s.size();i++)
    			if(s[i]!=s[s.size()-1-i])
    			{
    				l=i-1;
    				break;
    			}
    		len1=l;
    		ll res1=0,res2=0;
    		for(int i=l+1;i<s.size()-l-1;i++)
    		{
    			res1=(res1+po[i-l-1]*(s[i]-'a')%mod)%mod;
    			res2=(res2*p+s[i]-'a')%mod;
    			if(res1==res2) len1=i;
    		}
    		len2=s.size()-l-1;
    		res1=res2=0;
    		for(int i=s.size()-l-2;i>l;i--)
    		{
    			res1=(res1+po[s.size()-l-1-i-1]*(s[i]-'a')%mod)%mod;
    			res2=(res2*p+s[i]-'a')%mod;
    			if(res1==res2) len2=i;
    		}
    		for(int i=0;i<=l;i++) cout<<s[i];
    		if(len1-l>=s.size()-l-1-len2) for(int i=l+1;i<=len1;i++) cout<<s[i];
    		else for(int i=len2;i<s.size()-l-1;i++) cout<<s[i];
    		for(int i=s.size()-l-1;i<s.size();i++) cout<<s[i];
    		puts("");
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    布隆过滤器
    springboot+redis实现分布式锁
    springboot+redis实现消息队列
    工作启示文章收藏
    redis常用命令
    前方的路
    分布式系统中对cookie和session的思考
    用Markdown来写自由书籍-开源技术的方案
    Centos 7.0添加yum本地安装源
    爹地,我找到了!15个极好的Linux find命令示例
  • 原文地址:https://www.cnblogs.com/neflibata/p/12871778.html
Copyright © 2020-2023  润新知