题目: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; }