B题:double u
思路:先把所有"w""m"扩展为"uu""nn",将长度逐渐最大化,若仍然未枚举到目标长度,再进行合并来缩短长度。可以用链表(STL:list)实现,代码逻辑性更强。
代码:
#include<iostream>
#include<cstring>
#include<list>
using namespace std;
int n,T,l,flag;
string temp;
int main() {
cin>>T;
while(T--) {
cin>>n>>temp;
list<char> t;
for(int i=0; i<temp.size(); ++i) t.push_back(temp[i]);
l=t.size(),flag=0;
for(auto i=t.begin(); i!=t.end(); )
if((*i)=='w'||(*i)=='m') {
char x=((*i)=='w'?'u':'n');
i=t.insert(t.insert(t.erase(i),x),x);
++i,++i,++l;
if(l==n) {
flag=1;
break;
}
} else ++i;
if(!flag)
for(auto i=t.begin(); i!=t.end();) {
auto p=i;
++p;
if(p!=t.end()&&(((*i)=='u'&&(*p)=='u')||((*i)=='n'&&(*p)=='n'))) {
char x=((*i)=='u'?'w':'m');
i=t.insert(t.erase(t.erase(i)),x);
++i,--l;
if(l==n) break;
} else ++i;
}
for(auto i=t.begin(); i!=t.end(); ++i) cout<<(*i);
cout<<'\n';
}
return 0;
}