标签:
题意:今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为n的字符串s. 他想要知道能否找到s的三个互不相交的子串s[l1..r1], s[l2..r2], s[l3..r3]满足下列条件:
1. 1≤l1≤r1<l2≤r2<l3≤r3≤n 2. s[l1..r1], s[l2..r2], s[l3..r3]依次连接之后得到字符串"anniversary".
思路:其实就是要在一个串中找可能存在的3个连续子串来构成这个"anniversary",穷举第一个串的大小,再穷举第2个串的大小,剩下的由第3个串来搞定。
1 //#include <bits/stdc++.h> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <algorithm> 7 #include <vector> 8 #include <map> 9 #include <set> 10 #include <stack> 11 #include <queue> 12 #define LL long long 13 #define pii pair<int,int> 14 #define INF 0x7f7f7f7f 15 using namespace std; 16 const int N=200; 17 18 19 string str; 20 string tmp="anniversary"; 21 22 23 24 int cal(int len) 25 { 26 if(len<tmp.size()) return false;//不可能 27 if(str.find( tmp )!= string::npos) return true; 28 if(len==tmp.size()) //相同串 29 { 30 if(str.find( tmp )!= string::npos) return true; 31 else return false; 32 } 33 34 35 for(int i=0; i<11; i++) 36 { 37 unsigned int s1=str.find(tmp.substr(0, i)); 38 if( s1+tmp.size()>=len || s1==string::npos ) continue; 39 40 for(int j=1; j+i<11; j++) 41 { 42 unsigned int s2=str.find( tmp.substr(i, j), s1+i ); 43 if( s2==string::npos ) continue; 44 int k=11-j-i; 45 if( str.find( tmp.substr(i+j, k), s2+j )!=string::npos) 46 { 47 //cout<<s1<<" "<<s2<<" "<<s3<<" "<<tmp.substr( 0,i )<<tmp.substr(i,j)<<tmp.substr(i+j, k)<<endl; 48 return true; 49 } 50 51 } 52 } 53 return false; 54 } 55 56 57 58 int main() 59 { 60 //freopen("input.txt", "r", stdin); 61 int n, m, t, p, q; 62 63 cin>>t; 64 while(t--) 65 { 66 cin>>str; 67 bool tmp=cal(str.size()); 68 if(tmp) puts("YES"); 69 else puts("NO"); 70 } 71 72 return 0; 73 }
标签:
原文地址:http://www.cnblogs.com/xcw0754/p/4676861.html