据说这场比赛非常简单,但本蒟蒻却认为比以往还要难(;´༎ຶД༎ຶ`)
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;
}