Untitled

 avatar
unknown
plain_text
a year ago
1.5 kB
4
Indexable
#include <bits/stdc++.h>
using namespace std;
const int MAXN=100000;
int n;
string a[MAXN];
struct kq
{
	string item;
	int count;
};
kq res[MAXN];
void nhap()
{
	cin>>n;
	for(int i=0;i<=n;i++)
	 getline(cin,a[i]);
}
int ss(string a, string b)
{
	if(a.size()<b.size()) return -1;
	if(a.size()>b.size()) return 1;
	for(int i=0;i<a.size();i++)
	 if(a[i]<b[i]) return -1;
	 else if(a[i]>b[i]) return 1;
	return 0;
}
int ss2(kq a, kq b)
{
	if(a.count==b.count) return ss(a.item,b.item);
	if(a.count>b.count) return -1;
	else return 1;
}
void sx(string a[], int l, int r)
{
	int mid=(l+r)/2;
	int i=l,j=r;
	while(i<=j)
	{
		while(ss(a[i],a[mid])<0) i++;
		while(ss(a[j],a[mid])>0) j--;
		if(i<=j)
		{
			swap(a[i],a[j]);
			i++;
			j--;
		}
	}
	if(l<i) sx(a,l,mid-1);
	if(r>j) sx(a,mid+1,r);
}
void sx2(kq a[], int l, int r)
{
	int mid=(l+r)/2;
	int i=l,j=r;
	while(i<=j)
	{
		while(ss2(a[i],a[mid])<0) i++;
		while(ss2(a[j],a[mid])>0) j--;
		if(i<=j)
		{
			swap(a[i],a[j]);
			i++;
			j--;
		}
	}
	if(l<i) sx2(a,l,mid-1);
	if(r>j) sx2(a,mid+1,r);
}
void xuly(string a[])
{
	a[n+1]=' ';
	kq res[MAXN];
	sx(a,1,n);
	int d=0;
	for(int i=1;i<=n;i++)
	{
		int j=i;
		while(a[i+1]==a[j]) i++;
		d++;
		res[d].item=a[j];
		res[d].count=(i-j)+1;
	}
	sx2(res,1,d);
	for(int i=1;i<=d;i++)
	 cout<<res[i].item<<" "<<res[i].count<<'\n';
}
int main()
{
	nhap();
	xuly(a);
	return 0;
}
Leave a Comment