zoukankan      html  css  js  c++  java
  • Codeforces Round #349 (Div. 1) A. Reberland Linguistics 动态规划

    A. Reberland Linguistics

    题目连接:

    http://www.codeforces.com/contest/666/problem/A

    Description

    First-rate specialists graduate from Berland State Institute of Peace and Friendship. You are one of the most talented students in this university. The education is not easy because you need to have fundamental knowledge in different areas, which sometimes are not related to each other.

    For example, you should know linguistics very well. You learn a structure of Reberland language as foreign language. In this language words are constructed according to the following rules. First you need to choose the "root" of the word — some string which has more than 4 letters. Then several strings with the length 2 or 3 symbols are appended to this word. The only restriction — it is not allowed to append the same string twice in a row. All these strings are considered to be suffixes of the word (this time we use word "suffix" to describe a morpheme but not the few last characters of the string as you may used to).

    Here is one exercise that you have found in your task list. You are given the word s. Find all distinct strings with the length 2 or 3, which can be suffixes of this word according to the word constructing rules in Reberland language.

    Two strings are considered distinct if they have different length or there is a position in which corresponding characters do not match.

    Let's look at the example: the word abacabaca is given. This word can be obtained in the following ways: , where the root of the word is overlined, and suffixes are marked by "corners". Thus, the set of possible suffixes for this word is {aca, ba, ca}.

    Input

    The only line contains a string s (5 ≤ |s| ≤ 104) consisting of lowercase English letters.

    Output

    On the first line print integer k — a number of distinct possible suffixes. On the next k lines print suffixes.

    Print suffixes in lexicographical (alphabetical) order.

    Sample Input

    abacabaca

    Sample Output

    3
    aca
    ba
    ca

    Hint

    题意

    给一个字符串,然后你你需要切一个长度至少为5的前缀下来,然后剩下的都得切成是长度为2或者3的字符串

    你需要连续的切出来的字符串都不一样,问你能够切出多少不同的块

    题解:

    前面那个直接n-5就好了,就把前缀切下来了

    然后考虑dp,dp[i][0]表示第i个位置,切下长度为2的可不可行

    dp[i][1]表示第i个位置,切下长度为3的可不可行

    dp[i][0] = dp[i-2][1] || (s[i]!=s[i-2]||s[i-1]!=s[i-3])&&dp[i-2][0]

    dp[i][1]这个转移同理

    然后莽一波

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    const int maxn = 1e4+6;
    char str[maxn];
    int dp[maxn][2];
    int n;
    vector<string>ans;
    int main()
    {
        scanf("%s",str);
        n=strlen(str);
        reverse(str,str+n);
        for(int i=1;i<n-5;i++)
        {
            if(i==1)
            {
                string s1="";
                s1+=str[i];
                s1+=str[i-1];
                ans.push_back(s1);
                dp[i][0]=1;
            }
            if(i==2)
            {
                string s1="";
                s1+=str[i];
                s1+=str[i-1];
                s1+=str[i-2];
                ans.push_back(s1);
                dp[i][1]=1;
            }
            if(i-3>=0&&(str[i]!=str[i-2]||str[i-1]!=str[i-3])&&dp[i-2][0]==1)
            {
                string s1="";
                s1+=str[i];
                s1+=str[i-1];
                ans.push_back(s1);
                dp[i][0]=1;
            }
            if(i-2>=0&&dp[i-2][1]==1)
            {
                 string s1="";
                s1+=str[i];
                s1+=str[i-1];
                ans.push_back(s1);
                dp[i][0]=1;
            }
            if(i-5>=0&&(str[i]!=str[i-3]||str[i-1]!=str[i-4]||str[i-2]!=str[i-5])&&dp[i-3][1]==1)
            {
                string s1="";
                s1+=str[i];
                s1+=str[i-1];
                s1+=str[i-2];
                ans.push_back(s1);
                dp[i][1]=1;
            }
            if(i-3>=0&&dp[i-3][0]==1)
            {
                string s1="";
                s1+=str[i];
                s1+=str[i-1];
                s1+=str[i-2];
                ans.push_back(s1);
                dp[i][1]=1;
            }
        }
        sort(ans.begin(),ans.end());
        ans.erase(unique(ans.begin(),ans.end()),ans.end());
        cout<<ans.size()<<endl;
        for(int i=0;i<ans.size();i++)
            cout<<ans[i]<<endl;
    }
  • 相关阅读:
    flex3 自定义控件
    Android 调用系统搜素框
    Android 自定义控件
    flex拖动时,按下ctrlKey和shiftKey,只执行Move操作
    Mvc4 webApi Json 序列化,日期Java解析失败的解决方法
    Ubuntu下安装Vmware workstation
    Android Activity传递自定义对象
    Flex4 格式化HTML
    Maven 环境搭建
    ActionScript 3 操作XML
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5448085.html
Copyright © 2011-2022 走看看