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;
}

浙公网安备 33010602011771号