510. Distinct Substrings

给你一个N,让你求有恰有N个不同字串的,尽可能短的,如有多个就字典序最小的那个的字符串。。。
我感觉没有任何思路,只能暴搜。。
肯定要减枝,就是估计一个当前以当前字符串为前缀的最大可能的不同子串数。。
我不知道对不对,我是在后面defghijk这么加上去再算不同字串数的。。
计算不同字串数的话题目中也说是标准的SA问题,但我直接用Set了。。
Code:

#include<cstring>#include<iostream>#include<string>#include<cstdlib>#include<set>#define Rep(i,n) for(int i=0;i<n;i++)using namespace std;int n;string C;int Get(const string&a){ set<string> S;int n=a.size(); for(int i=0;i<n;i++) for(int j=1;i+j<=n;j++) S.insert(a.substr(i,j)); return S.size();}int Cal(int p,char u){ for(int i=p;i<C.size();i++) C[i]=++u; return Get(C);}void Dfs(int p,char u){ int N=Cal(p,u); if(N<n)return; if(p==C.size()) { if(N==n) { cout<<C<<endl; exit(0); } return; } for(char a=’a’;a<=u;a++) { C[p]=a; Dfs(p+1,u); } if(u<‘z’){C[p]=++u;Dfs(p+1,u);}}int main(){ cin>>n; for(int i=1;;i++) { C.resize(i); Dfs(0,’a’-1); }}

Leave a Reply

Your email address will not be published. Required fields are marked *