这一题就是用暴力枚举,但是很多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; }