这一题就是用暴力枚举,但是很多case我之前没有考虑到,结果WA得很惨。
一个是要排除A B C为空字符串的case,这个在枚举长度的时候就可以注意到。
另外一处是因为我逻辑混乱,if先找到AB的组合,如果AB前半部分和后半部分两部分相等,并不代表组合不存在。。。
感谢这里强大的数据:http://blog.csdn.net/xhldtc/article/details/39135475
另外感觉这种枚举方法会不会不容易WA http://blog.csdn.net/u011345136/article/details/39122729
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include <ctype.h>
using namespace std;
int T;
string s;
void input()
{
s.clear();
//cout<<s<<endl;
char tmp[60];
scanf("%s",tmp);
int ll=strlen(tmp);
//cout<<ll<<endl;
for(int i=0;i<ll;i++)
{
if(isalpha(tmp[i]))
s+=tmp[i];
}
//cout<<s<<endl;
}
void run()
{
int len=s.length();
//cout<<len<<endl;
for(int i=2;i<=len/2;i++)
{
string a=s.substr(0,i);
string b=s.substr(i,i);
if(a==b)
{
//if(a.length()%2==0&&s.substr(0,i/2)==s.substr(i/2,i/2)) continue; 这种case下 A B如果长度不等,组合也可能存在,
int l=len-2*i;
if(l==0) continue;
if(l<i)
{
string c=s.substr(2*i,l);
string d=s.substr(0,l);
string f=s.substr(l,i-l);
if(c==d&&d!=f)
{
// cout<<i<<endl;
printf("Yes\n");
return;
}
}
else if(l>i)
{
// if(i==7) cout<<i<<" "<<l<<endl;
string e=s.substr(len-i,i);
string g=s.substr(2*i,l-i);//C
//cout<<"C:"<<g<<endl;
//cout<<a<<" "<<e<<" "<<g<<endl;
if(a==e)
{
for(int k=1;k<i;k++)
{
string h=s.substr(0,k);//A
string x=s.substr(k,i-k);//B
// if(k==1) cout<<h<<" "<<x<<endl;
if(h!=x&&h!=g&&x!=g)
{
// cout<<h<<"B:"<<x<<"C:"<<g<<endl;
//cout<<i<<" "<<l<<" "<<k<<endl;
printf("Yes\n");
return;
}
}
//
// cout<<h<<" "<<x<<endl;
// if(h!=g&&g!=x)
// {
// //cout<<i<<" "<<l<<endl;
//
// }
}
}
}
}
printf("No\n");
}
int main()
{
freopen("input.txt","r",stdin);
scanf("%d",&T);
for(int i=0;i<T;i++)
{
input();
run();
}
return 0;
}