USACO3.1 Contact(contact)

        由于1<=a<=b<=12,因此能够将输入的字符所有存进str,而后for i:a~b,依次检测str中长度为i的字符串出现的次数,存进map<string,int> map1,而后将map1的key和value翻转,存进multimap<int,string> map2,而后for i:1~n,每次取出第i大的key值对应的value,能够存进set<string>中输出。感受复杂度蛮高,可是最后一个测试里仅仅0.184s,出乎意料啊。另外程序写的极为难看,恶心到我本身了。。。ios

        最近在搞数模培训,上午培训,下午晚上自由活动,但是一有时间就想玩,不想玩了吧就想写个程序,数模啊数模,我可不想这么热的天是在这混日子啊。。。测试

/*
ID:jzzlee1
PROB:contact
LANG:C++
*/
//#include<iostream>
#include<fstream>
#include<map>
#include<set>
#include<string>
#include<cstring>
using namespace std;
ifstream cin("contact.in");
ofstream cout("contact.out");
string str,s;
map<string,int> map1;
multimap<int,string> map2;
map<string,int>::iterator iter;
multimap<int,string>::reverse_iterator p,q;
class rule:greater<string>  
{  
public:  
    bool    operator () (string b1,string b2) const
	{  
        if(b1.size()>b2.size())
			return 0;
		else if(b1.size()<b2.size())
			return 1;
		else
			return b1<b2;
    }  
};
int main()
{
	int a,b,n;
	cin>>a>>b>>n;
	getchar();
	while(getline(cin,s))
	str+=s;
	int i,j;
	if(b>str.size())
		b=str.size();
	if(n>str.size())
		n=str.size();
	for(i=a;i<=b;i++)
	{
		for(j=0;j+i<=str.size();j++)
		{
			s.assign(str,j,i);
			++map1[s];
		}
	}
	for(iter=map1.begin();iter!=map1.end();iter++)
		map2.insert(make_pair(iter->second,iter->first));
	p=q=map2.rbegin();
	for(i=0;i!=n;i++)
	{
		j=1;
		set<string,rule> iset;
		while(p!=map2.rend()&&p->first==q->first)
		{
			iset.insert(p->second);
			p++;
		}
		set<string,rule>::reverse_iterator iser=iset.rbegin();
		if(iset.empty())
			break;
		cout<<q->first<<endl;
		set<string,rule>::iterator iseter;
		for(iseter=iset.begin();iseter!=iset.end();iseter++)
		{
			if(j%6)
			{
				if(j%6!=1)
					cout<<" ";
				cout<<*iseter;
			}
			else
				cout<<" "<<*iseter<<endl;
			j++;
		}
		q=p;
		if((j-1)%6)
			cout<<endl;
	}
	return 0;
}
相关文章
相关标签/搜索