• 构造字符串。。


    构造字串
    生成长度为n的字串,其字符从26个英文字母的前p(p≤26)个字母中选取,使得没有相邻的子序列相等。例如p=3,n=5时
     ‘a b c b a’满足条件    
    ‘a b c b c’不满足条件

    INPUT:

    两个整数N,P;N<=10,P<=26;

    5  3

    OUTPUT:

    所有满足条件的字串的方案总数

    30

    思路:

    一道典型的dfs。但是是字符串。如样例:B C=B C所以不符合条件。每添加一个,就要判断是否有重复。如果有return;

    如何判断?

    1 if(s1.size()%2==0)
    2             {
    3                 for(int j=2;j<=s1.size()/2;j++)
    4                 {
    5                     x=s1.substr(s1.size()-j+1,j-1);x+=i;
    6                     y=s1.substr(s1.size()-2*j+1,j);
    7                     if(x==y)                  {f=0;   break;}
    8                 }
    9             }

    但是,位数不够呢?

     1 if(s1.size()>2)
     2         {
     3             if(s1.size()%2==0)
     4             {
     5                 for(int j=2;j<=s1.size()/2;j++)
     6                 {
     7                     x=s1.substr(s1.size()-j+1,j-1);x+=i;
     8                     y=s1.substr(s1.size()-2*j+1,j);
     9                     if(x==y)                  {f=0;   break;}
    10                 }
    11             }
    12             else
    13             {
    14                 for(int j=2;j<=s1.size()/2+1;j++)
    15                 {
    16                     x=s1.substr(s1.size()-j+1,j-1);
    17                     x+=i;
    18                     y=s1.substr(s1.size()-2*j+1,j);
    19                     if(x==y)
    20                     {f=0;   break;}
    21                 }
    22             }
    23         }

    cpp:

     1 #include<iostream>
     2 #include<string>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<iomanip>
     8 #include<queue>
     9 using namespace std;
    10 string s1,x,y;
    11 int n,p,sum=0;
    12 void dfs(string s1)
    13 {
    14     if(s1.size()==n) {sum++; return;}
    15     for(char i='a';i<'a'+p;i++)
    16     {
    17         if(i==s1[s1.size()-1])    continue;
    18         bool f=1;
    19         if(s1.size()>2)
    20         {
    21             if(s1.size()%2==0)
    22             {
    23                 for(int j=2;j<=s1.size()/2;j++)
    24                 {
    25                     x=s1.substr(s1.size()-j+1,j-1);x+=i;
    26                     y=s1.substr(s1.size()-2*j+1,j);
    27                     if(x==y)                  {f=0;   break;}
    28                 }
    29             }
    30             else
    31             {
    32                 for(int j=2;j<=s1.size()/2+1;j++)
    33                 {
    34                     x=s1.substr(s1.size()-j+1,j-1);
    35                     x+=i;
    36                     y=s1.substr(s1.size()-2*j+1,j);
    37                     if(x==y)
    38                     {f=0;   break;}
    39                 }
    40             }
    41         }
    42         if(f==1)    dfs(s1+i);
    43     }
    44 }
    45 int main()
    46 {
    47     
    48     //freopen("a.in","r",stdin);
    49     //freopen("a.out","w",stdout);
    50     cin>>n>>p;
    51     for(char i='a';i<'a'+p;i++)
    52     {
    53        s1.clear();
    54         dfs(s1+i);
    55     }
    56     cout<<sum<<endl;
    57     return 0;
    58 }
    View Code

     P.S(cpp   MADE BY MHZ)

  • 相关阅读:
    HDU 4763 Theme Section(KMP+枚举公共前后缀)
    HDU 3613 Best Reward(扩展KMP求前后缀回文串)
    HDU 3613 Best Reward(manacher求前、后缀回文串)
    扩展KMP模板
    Vue
    Vue
    css 文本换行 文本溢出隐藏用省略号表示剩下内容
    sublime 神一样的插件
    markdown
    css 居中布局
  • 原文地址:https://www.cnblogs.com/zyker/p/5927730.html
Copyright © 2020-2023  润新知