原本想的方法:利用暴力模拟+map记录
所有可能子串相当于满二叉树的路径序列,用遍历二叉树的方式不断拼接字符串构造可能的序列 。层序比较简单,但题目要求按DFS的顺序

最后发现答案正确,但超出空间限制了
仔细想想没必要,只在输入字符串的序列中找可能序列即可 

看了标准答案,发现这个方法还是有点弱智
substr既然已经得到子串序列了,直接用map统计就完了,干嘛还要find啊....

#include<string>
#include<set>
#include<iostream>

using namespace std;

int main(){//例题10.9  北京大学  子串计算

	//逐个输入处理 
	string seq; 
	while(cin>>seq){
		int n = seq.size();
		
		set<string> table;
		//构造可能序列 
		for(int len=1;len<=n;len++){//长度为1、2、3...的序列
			for(int start=0;start<=n-len;start++){//从0、1、2...开始的序列 
				table.insert(seq.substr(start,len)); 
			} 
		} 
		
		
		//判断可能序列
		set<string>::iterator it;
		for(it = table.begin();it!=table.end();it++){
			if(it->size()>n) continue;
			
			int start = 0;
			int counter = 0;			

			while(start<n){
				start = seq.find(*it,start);
				if(start==string::npos){
					break;
				} else {
					counter++;
					start++;
				}
			}
			if(counter>1)cout<<*it<<" "<<counter<<endl;
		}
		
	} 
	return 0;
}