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;
}
原文地址:https://www.cnblogs.com/neflibata/p/12871778.html