题意:
判断加a之后是不是回文
思路:
如果全是a,输出NO
不是,就把a放到左右两边判断
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
using namespace std;
string s;
int f()
{
int flag = 0;
s = 'a' + s;
for(int i=0, j=s.size()-1; i<j; i++,j--)
{
if(s[i] != s[j])
{
flag = 1;
break;
}
}
if(flag)
return flag;
s = s + 'a';
for(int i=1, j=s.size()-1; i<j; i++,j--)
{
if(s[i] != s[j])
{
flag = 2;
break;
}
}
return flag;
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> s;
int cnt = 0;
for(int i=0; i<s.size(); i++)
{
if(s[i] == 'a')
cnt++;
}
if(cnt == s.size())
puts("NO");
else
{
puts("YES");
int flag = f();
if(flag == 1)
{
for(int i=0; i<s.size(); i++)
cout << s[i];
}
else if(flag == 2)
{
for(int i=1; i<s.size(); i++)
cout << s[i];
}
puts("");
}
}
return 0;
}
题意:
每次把一个前缀和的区间翻转,问最后能不能把a串变成b串
思路:
前缀和,标记01的交界,判断交界处的前缀和
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int N = 3e5+10;
int s[N], sum[N], vis[N];
int main()
{
int t;
string s1, s2;
cin >> t;
while(t--)
{
int n;
cin >> n >> s1 >> s2;
memset(sum, 0, sizeof sum);
int cnt = 0, flag = 1;
for(int i=1; i<=n; i++)
{
s[i] = abs(s1[i-1] - s2[i-1]);
if(s1[i-1] - '0' == 0)
{
sum[i] = sum[i-1] - 1;
}
else
{
sum[i] = sum[i-1] + 1;
}
if(s[i-1] != s[i])
{
vis[cnt++] = i - 1;
if(sum[i-1] != 0)
{
flag = 0;
break;
}
}
}
if(s[n] == 1 && sum[n] != 0)
flag = 0;
if(flag)
{
puts("YES");
}
else
{
puts("NO");
}
for(int i=0; i<cnt; i++)
{
vis[cnt] = 0;
}
}
return 0;
}
题意:
给一个串,s[i] == 1代表接下来的两个串的s1[i]和s2[i]相等,否则不等,最后输出两个串
思路:
统计1和0的数量,1的前一半全部变成’ ( ‘,后一半变成’ ) ',0变成()()和)()(这种形式,两边出现0就NO,中间再加个模拟栈判断,判断是否所有的()都满足条件
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stack>
using namespace std;
const int N = 2e5+10;
char s1[N], s2[N];
int main()
{
int t;
string s;
cin >> t;
while(t--)
{
int n;
int st1 = 0, st2 = 0;
int f1 = 0, f2 = 0, flag = 1;
int cnt1 = 1, cnt2 = 0;
cin >> n >> s;
for(int i=0; i<n; i++)
{
if(s[i] == '1')
f1++;
else
f2++;
}
for(int i=0; i<n; i++)
{
if(s[i] == '1')
{
if((cnt1++) <= f1 / 2)
{
s1[i] = '(';
s2[i] = '(';
st1++;
st2++;
}
else
{
s1[i] = ')';
s2[i] = ')';
st1--;
st2--;
}
}
else
{
if((cnt2++) & 1)
{
s1[i] = '(';
s2[i] = ')';
st1++;
st2--;
}
else
{
s1[i] = ')';
s2[i] = '(';
st1--;
st2++;
}
}
}
if(st1 != 0 || st2 != 0 || s[0] == '0' || s[n-1] == '0')
flag = 0;
if((f1 + f2) & 1)
flag = 0;
if(flag)
{
puts("YES");
for(int i=0; i<n; i++)
{
cout << s1[i];
}
cout << endl;
for(int i=0; i<n; i++)
{
cout << s2[i];
}
cout << endl;
}
else
{
puts("NO");
}
}
return 0;
}
交互题
题意:
A给一个数,B选择三个数中不同于A选择的数,填到方格里面,颜色相同的不能相邻,并且一定可以找到一种策略满足条件
思路:
其实这种形式
1 2 1 2 1
2 1 2 1 2
1 2 1 2 1
2 1 2 1 2
1 2 1 2 1
问1,就在2的位置填2,问2,就在1的位置填1,如果填满,就在其他位置填3,比如问2,但是1填满了,那就在2的位置填3, 1同理,如果问3,1的位置没满就在1的位置填1,满了就在2的位置填2就好
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stack>
using namespace std;
int main()
{
int t;
cin >> t;
pair<int, int>p;
stack<pair<int, int> >s1;
stack<pair<int, int> >s2;
for(int i=1; i<=t; i++)
{
p.first = i;
for(int j=1; j<=t; j++)
{
p.second = j;
if((i + j) & 1)
{
s2.push(p);
}
else
{
s1.push(p);
}
}
}
int n = t * t;
while(n--)
{
int x;
cin >> x;
if(x == 1)
{
if(s2.empty())
{
cout << 3 << " " << s1.top().first << " " << s1.top().second;
s1.pop();
}
else
{
cout << 2 << " " << s2.top().first << " " << s2.top().second;
s2.pop();
}
}
else if(x == 2)
{
if(s1.empty())
{
cout << 3 << " " << s2.top().first << " " << s2.top().second;
s2.pop();
}
else
{
cout << 1 << " " << s1.top().first << " " << s1.top().second;
s1.pop();
}
}
else
{
if(!s1.empty())
{
cout << 1 << " " << s1.top().first << " " << s1.top().second;
s1.pop();
}
else if(!s2.empty())
{
cout << 2 << " " << s2.top().first << " " << s2.top().second;
s2.pop();
}
}
puts("");
}
return 0;
}
如果用scanf和printf,记得输出 fflush(stdout) or cout.flush();