• 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;
    }
  • 相关阅读:
    整理ASP.NET MVC 5各种错误请求[401,403,404,500]的拦截及自定义页面处理实例
    Sql Server 创建表添加说明
    c# 去除字符串中重复字符
    WebStorm中常用的快捷键及使用技巧
    git bash中的快捷键
    git bash here 的 ~/.bashrc 配置文件。和 vue/cli 3. 0 的 .vuerc文件(preset )
    右键菜单添加打开CMD选项
    Vue中使用Vue.component定义两个全局组件,用单标签应用组件时,只显示一个组件的问题和 $emit的使用。
    vue和stylus在subline中显示高亮
    stylus入门教程,在webstorm中配置stylus
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5448085.html
Copyright © 2020-2023  润新知