题解:根据描述,加上简单题,以及数据规模很小,不妨有按照题目描述解法。
static bool cmp(string a,string b){
return a.length()<b.length();
}
vector<string> stringMatching(vector<string>& words)
{
sort(words.begin(),words.end(),cmp);
vector<string>ret;
for(int i=0;i<words.size();i++)
{
for(int j=i+1;j<words.size();j++)
{
int begin=-1;
if((begin=words[j].find(words[i],begin+1))!=string::npos)
{//此句为字符串匹配
ret.push_back(words[i]);
break;
}
}
}
return ret;
}
题解:根据描述,有了啊,有了啥?有了答案。
vector<int> processQueries(vector<int>& queries, int m) {
vector<int>p;
for(int i=1;i<=m;i++)p.push_back(i);//根据描述生成数组p
vector<int>ret;
for(int i=0;i<queries.size();i++){
vector<int>::iterator it = find(p.begin(), p.end(),queries[i]);
int tmp = *it;//1.保存移动的值
p.erase(it);//2. 删掉
ret.push_back(it-p.begin());//3. 插到最前面
p.insert(p.begin(),tmp);//
}
return ret;
}
题解:本次周赛前三题都是模拟题呢?没有啥子变通,根据题意模拟就行啦,自己的代码功底(API)熟悉程度不行啊,哭唧唧。
string entityParser(string text) {
map<string,char>m = {{">",'>'},{"<",'<'},{"&",'&'},{""",'"'},{"&apos",'\''},{"&frasl",'/'}};
string ret;
for(int i=0;i<text.length();i++){
if(text[i]!='&') ret+=text[i];
else{
int flag = 0;
string sub = text.substr(i,3);
for(auto j:m){
if(sub==j.first){
flag = 1;
ret+=j.second;
i+=3;
break;
}
}
sub = text.substr(i,4);
for(auto j:m){
if(sub==j.first){
flag=1;
ret+=j.second;
i+=4;
break;
}
}
sub = text.substr(i,5);
for(auto j:m){
if(sub==j.first){
flag=1;
ret+=j.second;
i+=5;
break;
}
}
sub = text.substr(i,6);
for(auto j:m){
if(sub==j.first){
flag =1;
ret+=j.second;
i+=6;
break;
}
}
if(flag ==0) ret+='&';
}
}
return ret;
}
题解:先看图
根据上图,可以将排列情况分为两种,ABA,ABC,前者颜色有重复,后者无,在这两种下面再添加元素有这么12种选择
ABC ACB BAC BCA CAB CBA ABA ACA BAB BCB CAC CBC
可分别加入到下面的如表格所示
ABA | ABC |
---|---|
unrepeat:BAC | unrepeat:BCA |
unrepeat:CAB | unrepeat:CAB |
unrepeat:BAB | |
repeat:BCB | repeat:BAB |
repeat:CAC | repeat:BCB |
在形如ABA这样的下面只能由3种unrepeat填充,2种repeat填充
在形如ABC这样的下面只能由2种unrepeat填充,2种repeat填充
每次填充依赖选择,当前可填充数目为
总结好规律后有下面代码:
int numOfWays(int n) {
if(n==0) return 0;
if(n==1) return 12;
long m = 6,k = 6;//k,m表示上一层repeat,unrepeat
long repeat,unrepeat;
for(int i=1;i<n;++i)
{
repeat = (2*(k+m))%1000000007;
unrepeat = (3*m+2*k)%1000000007;
m = unrepeat;
k = repeat;
}
return (unrepeat+repeat)%1000000007;
}