A题,注意可以先变为一种颜色之后再把这种颜色变为另一种颜色,比如aabc变为bbbc再变为cccc,所以判断是否有两个以上一样颜色即可。不过注意N= 1,直接输出Yes就行了。注意思考啊。
B题,定义了一个序列的WCD,WCD是序列中每对数至少一个数的因子。请你任意输出一个WCD,如果不存在输出-1.
因为WCD是序列中每一对都有这个因子,所以我们把第一个数分解质因数。这个数目最多只有32个。然后用后面的数进行判断,只有有一个对不符合,就把这个数给删去,看最后还剩下多少个数。输出任意一个就行。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int MAX = 150010;
typedef long long ll;
pair<ll,ll> p[MAX];
set<ll> st;
void fenjie(ll x){
ll i = 2;
while(i*i<=x){
if(x % i == 0){
st.insert(i);
while(x % i == 0) x/= i;
}
++i;
}
if(x > 1) st.insert(x);
}
int main(void){
int N;
scanf("%d",&N);
for(int i=1;i<=N;++i){
scanf("%I64d%I64d",&p[i].first,&p[i].second);
}
fenjie(p[1].first);
fenjie(p[1].second);
//把第一对数分解。
for(int i=2;i<=N;++i){
vector<ll> need;
for(set<ll>::iterator it = st.begin();it != st.end();++it){
ll v = *it;
if(p[i].first % v != 0 && p[i].second % v != 0)
need.push_back(v);
}
for(vector<ll>::iterator it = need.begin();it != need.end();++it){
st.erase(*it);
}
}
if(st.size() == 0){
printf("%d\n",-1);
}
else{
printf("%I64d\n",*st.begin());
}
return 0;
}
C题,最迷糊的一道题目。给你一个bw串,你可以进行按压反转操作,比如,bwwb,你在ww之间按压一次就会变为wbbw,两边都反转。问你一个bw串可以变为最长bwbwbw,或者wbwbw,就是相邻不相同的串,最长是多少。
XJB想,最多只反转一次就可以。最开始是打算枚举位置,但发现会超时,所以考虑,只反转,第一个相同的位置,就是碰到第一个ww,或者bb进行反转,再与之前比较一次。不过发现这样,和我同学的把这个串扩大一倍,就是把这个串再拼接到后面是一样的道理。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int MAX = 1e5+10;
int GetString(string str){
int len = str.length();
int Max = 0;
int l = 1;
for(int i=1;i<len;++i){
if(str[i] != str[i-1])
l++;
else{
Max = max(Max,l);
l = 1;
}
}
Max = max(Max,l);
return Max;
}
int main(void){
string str;
cin >> str;
int len = str.length();
if(str[0] == str[len-1]){
cout << GetString(str);
}
else{
int res = GetString(str);
string ss = "";
int pos = 0;
while(++pos < len){
if(str[pos] == str[pos-1])
break;
}
for(int i=pos-1;i>=0;--i)
ss += str[i];
for(int i=len-1;i>=pos;--i)
ss += str[i];
res = max(res,GetString(ss));
cout << res << endl;
}
return 0;
}