#include<iostream>
#include<deque>
#include<vector>
#include<map>
#include<string>
using namespace std;
typedef deque<string> Prefix;
map<Prefix,vector<string> > statetab;
string NONWORD="\n";
enum {MAXGEN=20,NPREF=2};
void build(Prefix&,istream&);
void add(Prefix&,const string&);
void generate(int);
int main(void)
{
freopen("in.txt","r",stdin);
int nwords=MAXGEN;
Prefix prefix;
for(int i=0;i<NPREF;i++)
add(prefix,NONWORD);
build(prefix,cin);
add(prefix,NONWORD);
generate(nwords);
return 0;
}
void build(Prefix& prefix,istream& in)
{
string buf;
while(cin>>buf)
add(prefix,buf);
}
void add(Prefix& prefix,const string& s)
{
if(prefix.size()==NPREF){
statetab[prefix].push_back(s);
prefix.pop_front();
}
prefix.push_back(s);
}
void generate(int nwords)
{
Prefix prefix;
int i;
for(i=0;i<NPREF;i++)
add(prefix,NONWORD);
for(i=0;i<nwords;i++){
vector<string>& suf=statetab[prefix];
const string& w=suf[rand()%suf.size()];
if(w==NONWORD)
break;
cout<<w<<" ";
prefix.pop_front();
prefix.push_back(w);
}
}
马尔可夫链文本处理
最新推荐文章于 2022-08-18 23:38:35 发布