据说这场比赛非常简单,但本蒟蒻却认为比以往还要难(;´༎ຶД༎ຶ`)
A.Strong Password
输入样例:
4 a aaa abb password
输出样例:
wa aada abcb pastsword
思路: 我们只需在原来字符串中连续的两个字符之间插入一个不同的字符,就可以使输入时间最大(注意输出要求中的maximum( ̄▽ ̄)"
代码:
void solve()
{
string s;cin>>s;
map<char,int> h;
int f=0;
for(int i=0;i<s.size();i++)
{
h[s[i]]++;
}
for(int i=1;i<s.size();i++)
{
if(s[i-1]==s[i])
{
string t=s.substr(0,i);
string tt=s.substr(i);
for(char j='a';j<='z';j=j+1)
{
if(!h[j])
{
f=1;
cout<<t<<j<<tt<<endl;
break;
}
}
}
if(f) break;
}
if(!f)
{
for(char j='a';j<='z';j=j+1)
{
if(!h[j])
{
cout<<s<<j<<endl;
break;
}
}
}
}
B. Make Three Regions
输入样例:
4 8 .......x .x.xx... 2 .. .. 3 xxx xxx 9 ..x.x.x.x x.......x
输出样例:
1 0 0 2
思路: 题目要我们求有多少种方案可以将一个’.'变成‘x'后形成三个连通块,注意题目保证给定网格中最多有一个连通块(当时就是没看到这个,直接寄了),我们会发现当初始条件下有一个连通块时,变成三个联通块需要形成以下两种图案:
x . x x . x
. . . => . x .
. . . . x .
x . x => x . x
所以我们只需要模拟是否出现以上两种图案就行了。
代码:
void solve()
{
int n;cin>>n;
string a,b;cin>>a>>b;
int ans=0;
for(int i=0;i<n;i++)
{
if(a[i]=='.'&&a[i+1]=='.'&&a[i+2]=='.')
{
if(b[i]=='x'&&b[i+1]=='.'&&b[i+2]=='x')
ans++;
}
if(b[i]=='.'&&b[i+1]=='.'&&b[i+2]=='.')
{
if(a[i]=='x'&&a[i+1]=='.'&&a[i+2]=='x')
ans++;
}
}
cout<<ans<<endl;
}
C. Even Positions
输入样例:
4 6 _(_)_) 2 _) 8 _)_)_)_) 8 _(_)_(_)
输出样例:
5 1 4 8
思路:出现一个')'肯定要用前面一个离它最近的'('抵消,我们可以用栈存储'('的位置,如果前面有还未抵消的'('则需要将'_'变成')',如果没有则变成'('。
代码:
void solve()
{
int n;cin>>n;
string s;cin>>s;
stack<int> stk;
int cnt=0,counter=0;
for(int i=0;i<n;i++)
{
if(s[i]==')')
{
counter--;
cnt+=i-stk.top();
stk.pop();
}
else if(s[i]=='(')
{
counter++;
stk.push(i);
}
else if(counter<=0)
{
stk.push(i);
counter++;
}
else
{
cnt+=i-stk.top();stk.pop();
counter--;
}
}
cout<<cnt<<endl;
}