• 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 CORE 使用 EF CORE访问数据库
    asp.net core连接sqlserver
    angular2+typescript在asp.net MVC Web项目上的实现
    leaflet在地图上加载本地图片
    AngularJs调用NET MVC 控制器中的函数进行后台操作
    AngularJs 的ng-include指令的使用
    redis持久化和分布式实现
    sqlserver事务隔离
    ASP.NET MVC 实现伪静态
    .NET下集中实现AOP编程的框架
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5448085.html
Copyright © 2020-2023  润新知