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;
}