SGU 510 Distinct Substrings

题目:http://acm.sgu.ru/problem.php?contest=0&problem=510

题意:构造一个刚好有n个不同子串的长度最短的字典序最小的字符串

参考:http://wjmzbmr.com/archives/510_distinct_substrings/

学会了更好的利用stl和string

还有写法更优美的dfs枚举

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
int n,flag;
string s;
int Get()
{
    set<string> se;
    int len=s.size();
    for(int i=0;i<len;i++)
        for(int j=1;i+j<=len;j++)
            se.insert(s.substr(i,j));
    return se.size();
}
int Cal(int now,char k)
{
    for(int i=now;i<s.size();i++)
        s[i]=++k;
    return Get();
}
void dfs(int now,char k)
{
    if (flag) return;
    int N=Cal(now,k);
    if (N<n) return;
    if (now==s.size())
    {
        if(N==n)
        {
            cout<<s<<endl;
            flag=1;
        }
        return;
    }
    for(char i='a';i<=k;i++)
    {
        s[now]=i;
        dfs(now+1,k);
        if (flag) return;
    }
    if (k<'z')
    {
        s[now]=++k;
        dfs(now+1,k);
        if (flag) return;
    }
}
int main()
{
    cin>>n;
    flag=0;
    for(int i=1;;i++)
    {
        s.resize(i);
        dfs(0,'a'-1);
        if (flag) break;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/bk-201/p/7826377.html