(BC 一周年)hdu 5311 Hidden String

Hidden String

 
 Accepts: 437
 
 Submissions: 2174
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 262144/262144 K (Java/Others)
问题描述
今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为nn的字符串ss. 他想要知道能否找到ss的三个互不相交的子串s[l_1..r_1]s[l1​​..r1​​], s[l_2..r_2]s[l2​​..r2​​], s[l_3..r_3]s[l3​​..r3​​]满足下列条件:

  1. 1 \le l_1 \le r_1 < l_2 \le r_2 < l_3 \le r_3 \le n1l1​​r1​​<l2​​r2​​<l3​​r3​​n

  2. s[l_1..r_1]s[l1​​..r1​​], s[l_2..r_2]s[l2​​..r2​​], s[l_3..r_3]s[l3​​..r3​​]依次连接之后得到字符串"anniversary".
输入描述
输入有多组数据. 第一行有一个整数TT (1 \le T \le 100)(1T100), 表示测试数据组数. 然后对于每组数据:

一行包含一个仅含小写字母的字符串ss (1 \le |s| \le 100)(1s100).
输出描述
对于每组数据, 如果Soda可以找到这样三个子串, 输出"YES", 否则输出"NO".
输入样例
2
annivddfdersewwefary
nniversarya
输出样例
YES
NO

比赛的时候没做出来,sad
我发现我有一个问题,就是不敢跑暴力
有不少题其实正解就是暴力
或者有的题,暴力不是标解,但是绝对可A,可我就不敢写...
就觉得不会是这样..
说到底还是不自信吧...

思路是枚举两个间隔点,将 string tar="anniversary"分成三个不为空的部分
然后在给的字符串中按顺序查找这三部分
如果都能找到,直接YES
如果任何一种间隔的分段都无法YES 就NO...

妈蛋,if语句后面多写了个分号,调了半个多小时才发现(为啥总是这种傻逼错误....)
还有一点,因为是多组数据,而对于每组数据,将tar拆分的方法都是一样的,可以先预处理一下存到数组里.
 /*************************************************************************
    > File Name: code/bc/#ann/1002.cpp
    > Author: 111qqz
    > Email: rkz2013@126.com
    > Created Time: 2015年07月25日 星期六 18时54分35秒
 ************************************************************************/

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
#define y0 abc111qqz
#define y1 hust111qqz
#define yn hez111qqz
#define j1 cute111qqz
#define tm crazy111qqz
#define lr dying111qqz
using namespace std;
#define REP(i, n) for (int i=0;i<int(n);++i)
typedef long long LL;
typedef unsigned long long ULL;
const int N=1E2+5;
int d[N];
int len;
int cnt;
string st,tar,s1[N],s2[N],s3[N];
bool flag;

void solve (string x,string y,string z)
{
  //  cout<<x<<"+"<<y<<"+"<<z<<endl;
    int lx = x.length();
    int ly = y.length();
    int lz = z.length();
    int p;
    int k = 0;
    for ( int i = 0 ; i  <= len-11 ; i++ )
    {
    string tmps = st.substr(i,lx);

    if (tmps==x)
    {
        p = i;
        k++;
        break;
    }
    }
    if (k==0) return;

    for ( int i =  p+lx ;  i <= len - 11 + lx ;i++)
    {
    string tmps = st.substr(i,ly);

    if (tmps==y)
    {
        p = i ;
        k++;
        break;
    }
    }
    if (k==1) return ;
    for ( int i = p+ly;  i <=len - 11+lx+ly ; i ++)
    {
    string tmps = st.substr(i,lz);
    if (tmps==z)
    {
        k++;
        break;
    }
    }
    if (k==3)
    {
    flag = true;
    return;
    }

}
int main()
{
    int T;
    tar = "anniversary";
    cnt =0;
    for ( int i = 1 ; i <= 9 ; i++ )
    {
    for ( int j = i +1 ; j<= 10 ; j++ )
    {
        cnt++;
        s1[cnt] = tar.substr(0,i);
        s2[cnt] = tar.substr(i,j-i);
        s3[cnt] = tar.substr(j);
        
    }
    }
    cin>>T;
    while (T--)
    {
      flag = false;
      cin>>st;
      len = st.length();
      int k = 0;
      int num = 0;
      
      for ( int i = 1;  i <= cnt  ; i++ )
      {

          solve(s1[i],s2[i],s3[i]);
      } 
      if (flag)
        {
        cout<<"YES"<<endl;
        }
      else
        {
        cout<<"NO"<<endl;
        }

    }

    return 0;
}

 


 
posted @ 2015-07-28 22:22  111qqz  阅读(190)  评论(0编辑  收藏  举报