• HDU 5311 Hidden String (暴力)


    题意:今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为n的字符串s. 他想要知道能否找到s的三个互不相交的子串s[l1..r1], s[l2..r2], s[l3..r3]满足下列条件:

      1. 1l1r1<l2r2<l3r3n
    
      2. s[l1..r1], s[l2..r2], s[l3..r3]依次连接之后得到字符串"anniversary".



    特别注意:式子中红色符号!!!


    思路:其实就是要在一个串中找可能存在的3个连续子串来构成这个
    "anniversary",穷举第一个串的大小,再穷举第2个串的大小,剩下的由第3个串来搞定。每个串必须大于等于1的大小才行,而且不能重叠到。

    如果用的是string自带的find,还需要特别注意的是OJ上string::npos可能并不是你机器上定义的那样,可能是-1,可能是unsigned的无穷大!总之最好避开这些东西~ 就是这里wa到怕了,因为BC和HDU上的并不一样,所以我在BC上交就过了,而HDU没过。






    BC上交的:

     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                 return true;
    48             }
    49 
    50         }
    51     }
    52     return false;
    53 }
    54 
    55 
    56 
    57 int main()
    58 {
    59     //freopen("input.txt", "r", stdin);
    60     int n, m, t, p, q;
    61 
    62     cin>>t;
    63     while(t--)
    64     {
    65         cin>>str;
    66         bool tmp=cal(str.size());
    67         if(tmp)     puts("YES");
    68         else        puts("NO");
    69     }
    70     return 0;
    71 }
    AC代码

    HDU 上的:

    #include <bits/stdc++.h>
    #define LL long long
    #define pii pair<int,int>
    #define INF 0x7f7f7f7f
    using namespace std;
    const int N=200;
    
    string str;
    string tmp="anniversary";
    int cal(int len)
    {
        for(int i=1; i+2<=tmp.size(); i++)
        {
            int s1=str.find(tmp.substr(0, i), 0);
            if( s1<0 )  continue;
    
            for(int j=1; j+i+1<=tmp.size(); j++)
            {
                int s2=str.find( tmp.substr(i, j), s1+i  );
                if( s2<0 )  continue;
    
                int k=tmp.size()-j-i;
                if(k<1) continue;
                if( str.find( tmp.substr(i+j, k), s2+j )<200 )
                    return true;
            }
        }
        return false;
    }
    int main()
    {
        freopen("input.txt", "r", stdin);
        int n, m, t, p, q;
        cin>>t;
        while(t--)
        {
            cin>>str;
            if( cal(   str.size()  ) )     printf("YES
    ");
            else                      printf("NO
    ");
        }
        return 0;
    }
    AC代码
     
  • 相关阅读:
    LOJ10092半连通子图
    LOJ104 普通平衡树
    LOJ10145郁闷的出纳员
    LOJ10144宠物收养所
    LOJ10043
    洛谷P3850 书架
    codevs 1814 最长链
    洛谷 P2022 有趣的数
    codevs 1312 连续自然数和
    noip 2010 引水入城
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4676861.html
Copyright © 2020-2023  润新知