• Codeforces 667C Reberland Linguistics【DFS】


    一道卡题意的题。


    题目链接:

    http://codeforces.com/problemset/problem/667/C

    题意:

    一个串可以看成一个长度大于4的根,加上其后面的若干个相邻(in a row)不同的长度为2或3的子串组成。给定字符串,问你有多少种不同的子串,并按字典序输出。

    分析:

    很容易想到dfs的做法,注意剪枝的地方,只有在合理的情况下才标记这种情况。对于每个子串直接放到set里面就好了。

    代码:

    #include<cstring>
    #include<set>
    #include<iostream>
    using namespace std;
    const int maxn = 1e4 + 5;
    string s;
    set<string>res;
    int tot = 0;
    int vis[4][maxn];
    void dfs(int cnt, int endd, int pa)
    {
        if(endd - cnt < 4||vis[cnt][endd]) return;
        string t;
        bool flg = true;
        for(int i = 0; i < cnt ; i++){
            t += s[endd - cnt + i + 1];
            if(pa != cnt || (pa == cnt && s[endd - cnt + i + 1] != s[endd + i + 1])) flg = false;
        }
        if(!flg){
            vis[cnt][endd] = true;
            res.insert(t);
            dfs(2, endd - cnt, cnt);
            dfs(3, endd - cnt, cnt);
        }
    }
    int main (void)
    {
        ios::sync_with_stdio(false);
        cin>>s;
        int len = s.length() ;
        dfs(2, len - 1, 0);
        dfs(3, len - 1, 0);
        cout<<res.size()<<endl;
        set<string>::iterator i;
        for(i = res.begin(); i != res.end(); i++){
            cout<<*i<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    天兔监控系统安装
    day6
    day5
    day4
    day3
    day2
    day1
    几个重要的Xenomai相关链接
    树莓派GPIO中断驱动程序
    转了一圈,再读LKD
  • 原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758642.html
Copyright © 2020-2023  润新知