绝世大坑:
list.insert(it,xx)是在it前面插入。如果想在it后面插入最好用list.insert(++(tmp=it),xx)。 list.insert(it,x)一般返回it下一个元素。
感受下:
#include <iostream>
#include <list>
#include <vector>
using namespace std;
typedef list<char>::iterator It;
void display(list<char>& lst){//for debug
for(It it=lst.begin();it!=lst.end();it++){
cout<<*it<<" ";
}cout<<endl;
}
int calc(list<char>&_lst)
{
int size0=_lst.size();
if(size0==0)
return 0;
int cnt=0;
list<char>::iterator tmp,it=_lst.begin();
char s[4]="ABC";
while(it!=_lst.end()){
for(int i=0;i<3;i++){
// tmp=_lst.insert(it,s[i]);//分别尝试在同一个位置插入A/B/C
_lst.insert(++(tmp=it),s[i]);//分别尝试在同一个位置(it后面)插入A/B/C
list<char> lst=_lst;
while(true)
{
int size=lst.size();
for(list<char>::iterator it=lst.begin();it!=lst.end();)
{
bool tag=false;
list<char>::iterator tmp=it;
tmp++;
while(tmp!=lst.end()&&*it==*tmp)
{
tmp=lst.erase(tmp);
tag=true;
}
if(tag)
it=lst.erase(it);
else
it++;
}///一轮消除完毕
if(lst.size()==size)//消除完毕
break;
}
cnt=max(cnt,(int)(size0+1-lst.size()));
_lst.erase(++(tmp=it));//删除刚刚插入的元素(it下一个节点)
}
it++;
}
return cnt;
}
int main()
{
list<char>lst;
int n;
cin>>n;
char buf[1000];
for(int i=0;i<n;i++)
{
cin>>buf;
lst.clear();
for(int j=0;buf[j]!=0;j++)
{
lst.push_back(buf[j]);
}
cout<<calc(lst)<<endl;
}
return 0;
}