• Codeforces Global Round 7


    如有帮助请移步voids5.cn,增加一些访问量,里面也有我未在csdn发布的博客

    #A. Bad Ugly Numbers

    题目大意:给你一个数字n你需要找到一个满足以下条件的数字s:
    1.s大于0
    2.s有n位数字
    3.s任一位上不包括0
    4.s不能被任意位上的数整除

    解题思路:可以发现s用两个质数组成可以满足上述条件

    Code:

    
    #include<bits/stdc++.h>
    
    using namespace std;
    int t,n;
    
    int main(){
    	cin>>t;
    	while(t--){
    		cin>>n;
    		if(n==1) cout<<-1<<endl;
    		else {
    			if((2*(n-1)+3)%3==0){
    				for(int i=1;i<=n-2;i++) cout<<2;
    				cout<<33<<endl;
    			}
    			else {
    				for(int i=1;i<n;i++) cout<<2;
    				cout<<3<<endl;
    			}
    		}
    	}
    
    	return 0;
    }
    

    B. Maximums

    题目大意:三个数组,a,x,b,x[i]是a[1 ~ i-1]的最大值,b[i]=a[i]-x[i],给你b数组,求a数组

    解题思路:因为x[1]=0,所以a[1]=b[1],故可由b数组推出x数组然后推出a数组

    Code:

    #include<bits/stdc++.h>
    
    using namespace std;
    const int N = 2e5+5;
    int t,n,b[N],a[N],x[N];
    
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>b[i];
    	x[1]=0;a[1]=b[1];
    	int maxx=a[1],pos=1;
    	for(int i=2;i<=n;i++){
    		a[i]=b[i]+maxx;
    		if(a[i]>maxx){
    			maxx=a[i];
    			pos=i;
    		}
    	}
    	for(int i=1;i<=n;i++){
    		cout<<a[i]<<' ';
    	}
    	cout<<endl;
    
    	return 0;
    }
    

    C. Permutation Partitions

    题目链接:https://codeforces.com/contest/1326/problem/C

    题目大意:给你一个由1~n组成的数组a[n],将数组分成k块,使每块的最大值最大,问最大值是多少和分法种数

    解题思路:分成k块其实就是将n~n-k+1这几个数字放入k个区间,类似于高中排列组合的插板问题,将板子插到所要找的数字间就好了

    Code:

    
    #include<iostream>
    using namespace std;
    typedef long long ll;
    const int mod=998244353;
    int n,k,x;
    ll ans=1,sum,p=-1;
    int main()
    {
        cin>>n>>k;
        for(int i=1;i<=n;i++){
            cin>>x;
            if(x>=(n-k+1)){
                sum+=x;
                if(p!=-1){
                    ans=ans*(i-p)%mod;
                }
                p=i;
            }
        }
        cout<<sum<<" "<<ans;
        return 0;
    }
    

    D1. Prefix-Suffix Palindrome (Easy version)

    题目链接:https://codeforces.com/contest/1326/problem/D1

    题目大意:给你一个字符串s,找到前后缀使a+b是回文串且最长

    解题思路:简单的我们可以模拟一下

    Code:

    #include <bits/stdc++.h>
    using namespace std;
    bool ok(const string &s,int l,int r){
        while(l<=r&&s[l]==s[r]) ++l,--r;
        return l>r;
    }
    void solve(){
        string s;cin>>s;
        int l=0,r=s.size()-1;
        while(l<r&&s[l]==s[r]) ++l,--r;
        int r2,l2;
        for(r2=r;r2>=l;r2--) if(ok(s,l,r2)) break;
        for(l2=l;l2<=r;l2++) if(ok(s,l2,r)) break;
        cout<<s.substr(0,l)
            <<((r2-l>r-l2)?s.substr(l,r2-l+1):s.substr(l2,r-l2+1))
            <<s.substr(r+1)
            <<"
    ";
    }
    int main()
    {
        int t;cin>>t;
        while(t--)
            solve();
        return 0;
    }
    

    D2. Prefix-Suffix Palindrome (Hard version)

    题目链接:https://codeforces.com/contest/1326/problem/D2

    题目大意:和D1一样只是范围大了

    解题思路:先首尾找到最长匹配的l,r;然后再取剩下字符串的较长的回文前缀或回文后缀

    KMP:

    
    #include<bits/stdc++.h>
    
    using namespace std;
    int n;
    string s;
    
    vector<int>cal_nxt(string s){
    	int n=s.length();
    	vector<int>nxt(n);
    	for(int i=1;i<n;i++){
    		int j=nxt[i-1];
    		while(j&&s[i]!=s[j]){
    			j=nxt[j-1];
    		}
    		if(s[i]==s[j]) nxt[i]=++j;
    	}
    	return nxt;
    }
    
    int main(){
    	cin>>n;
    	while(n--){
    		cin>>s;
    		int len = s.length();
    		int i=0,j=len-1;
    		while(i<j&&s[i]==s[j]) i++,j--;
    		string s1=s.substr(i,j-i+1);
    		string s2=s1;
    		reverse(s2.begin(),s2.end());
    		vector<int>nxt1=cal_nxt(s1+"#"+s2);
    		vector<int>nxt2=cal_nxt(s2+"#"+s1);
    		int len2=s1.size()+1+s2.size();
    //		cout<<j+1<<endl;
    //		cout<<nxt1[len2-1]<<' '<<nxt2[len2-1]<<endl;
    		if(nxt1[len2-1]>=nxt2[len2-1]){
    			cout<<s.substr(0,i)<<s1.substr(0,nxt1[len2-1])<<s.substr(j+1,len-j+1)<<endl;
    		}
    		else {
    			cout<<s.substr(0,i)<<s2.substr(0,nxt2[len2-1])<<s.substr(j+1,len-j+1)<<endl;
    		}
    	}
    
    	return 0;
    }
    

    字符串哈希:这个还是蛮坎坷的,按yxc大佬的模除2^64wa4,base=131 wa110,按我的写法ss=="",时也会输出一个空格。我太难了

    #include<bits/stdc++.h>
    
    using namespace std;
    int n;
    string s;
    typedef long long ll;
    typedef unsigned long long ull;
    const ll N = 1e6+5,base=113,mod=1e9+7;
    ull p[N];
    
    void init(){
    	p[0]=1;
    	for(int i=1;i<N;i++){
    		p[i]=p[i-1]*base%mod;
    	}
    }
    
    int main(){
    	init();
    	cin>>n;
    	while(n--){
    		cin>>s;
    		int len = s.length();
    		int l=0,r=len-1;
    		while(l<r&&s[l]==s[r]) l++,r--;
    		string ss=s.substr(l,r-l+1);
    		string tt=ss;
    		reverse(tt.begin(),tt.end());
    		int len1=ss.size();
    		ll res1=0,res2=0;
    		int ans1=0,ans2=0;
    		for(int i=0;i<len1;i++){
    			res1=(res1+p[i]*(ss[i]-'a')%mod)%mod;
    			res2=(res2*base+(ss[i]-'a'))%mod;
    			if(res1==res2) ans1=i;
    		}
    		res1=0,res2=0;
    		for(int i=0;i<len1;i++){
    			res1=(res1+p[i]*(tt[i]-'a')%mod)%mod;
    			res2=(res2*base+(tt[i]-'a'))%mod;
    			if(res1==res2) ans2=i;
    		}
    //		if(ans1==0) ss="";
    //		if(ans2==0) tt="";
    		for(int i=0;i<l;i++) cout<<s[i];
    		if(ans1>=ans2){
    			if(ss!="")for(int i=0;i<=ans1;i++) cout<<ss[i];
    		}
    		else {
    			if(tt!="")for(int i=0;i<=ans2;i++) cout<<tt[i];
    		}
    		for(int i=r+1;i<len;i++) cout<<s[i];
    		cout<<endl;
    	}
    
    	return 0;
    }
    
    
    七月在野,八月在宇,九月在户,十月蟋蟀入我床下
  • 相关阅读:
    PHP生成xml 无法识别或是无法读取或是浏览器不识别等问题
    关于PHP 采集类
    Centos7 下安装Docke
    Git使用之设置SSH Key
    yii2.0中Rbac 怎么添加超加管理员
    Undefined index: HTTP_RAW_POST_DATA的解决办法
    window下phpstudy的nginx配置虚拟主机
    yii2.0中添加二维数组,多条数据。
    预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445端口
    github与git之间怎么建立连接
  • 原文地址:https://www.cnblogs.com/voids5/p/12695014.html
Copyright © 2020-2023  润新知