题目描述
给出m个字符串,要求输出重复n次的字符串有几个。
输入
先给定一个N,N≤100000,接着输入N个字符串。
输出
对于每组测试数据,输出若干行,每行两个正整数,第一个数表示重复的次数,第二个数表示在此重复次数下有几种不同的字符串。
样例输入
5
BBA
BBA
BEA
DEC
CCF
样例输出
1 3
2 1
代码实现
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int n,i,j;
char s[1000][1000];
int count[1000];
cin>>n;
for(i=0;i<n;i++){
cin>>s[i];
}
memset(count,0,sizeof(count));
for(i=0;i<n;i++){
if(strcmp(s[i]," ")==0)continue; //如果字符串为空,比较下一个
int sum=1;
for(j=i+1;j<n;j++){
if(strcmp(s[i],s[j])==0){
sum++;
strcpy(s[j]," "); //如果相等,计数器加一同时将相同的字符串置为空
}
}
++count[sum];
}
for(i=0;i<1000;i++){
if(count[i]!=0){
cout<<i<<" "<<count[i]<<endl;
}
}
return 0;
}
最近再做这题时又有了新的思路,不过运行后的时间复杂度比上面的方法要长。
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
struct str{
char s[10000];
}str[10000];
int cmp(const void*a,const void*b)
{
struct str* m=(struct str*)a;
struct str* n=(struct str*)b;
return strcmp(m->s,n->s);
}
int main()
{
int i,n;
while(~scanf("%d",&n)){
int count[10000];
memset(count,0,sizeof(count));
memset(str,0,sizeof(str));
for(i=0;i<n;i++){
cin>>str[i].s;
}
qsort(str,n,sizeof(str[0]),cmp);
int sum=1;
for(i=0;i<n-1;i++){
if(strcmp(str[i].s,str[i+1].s)==0){
sum++;
}
else {
count[sum]++;
sum=1;
}
}
count[sum]++;
for(i=0;i<n;i++){
if(count[i]!=0){
cout<<i<<" "<<count[i]<<endl;
}
}
}
cout<<endl;
return 0;
}