题目
题意: 字符串输入输出统计,贼麻烦。
思路: 模拟+sort
时间复杂度: O(nlognlogn)时间复杂度好像写高了,map套set了,不过两个log也T不了,我就不信周老师会个10000*500个全a文章来卡我们大好青年,反正能骗分,虽然现在测不了了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define mem(a,x) memset(a,x,sizeof(a))
#define fir(i,a,b) for(int i=a;i<=b;++i)
const int N = 1e5+10;
typedef pair<int,int> PII;
int n,m,k,T;
struct word{
string s;
int cnt;
bool operator<(const word&rhs)const
{
if(cnt != rhs.cnt)
{
return cnt > rhs.cnt;
}
return s < rhs.s;
}
};
vector<word> va;
struct news{
string s1,s2;
}a[N]; int tot = 0;
map<string,set<int> >mp2;
string fun(string &s)
{
string res;
for(int i=0;i<s.size();++i)
{
if(s[i]>='A'&&s[i]<='Z') s[i] = s[i]-'A'+'a';
if((s[i]>='a'&&s[i]<='z')||(s[i]>='0'&&s[i]<='9')||(s[i]=='-'))
{
res += s[i];
}
}
return res;
}
void solve()
{
string s;
int cas = 1;
while(true)
{
getline(cin,s);
// cout<<s<<"?"<<endl;
a[tot].s1 = s;
getline(cin,s);
// cout<<s<<"?"<<endl;
a[tot].s2 = s;
bool ok = true;
tot++;
while(true)
{
cin>>s;
if(s == "------") break;
if(s == "######") {ok = 0; break;}
s = fun(s);
mp2[s].insert(cas);
}
cas++;
if(!ok) break;
cin.get();
}
cin>>n>>k;
for(int i=0;i<n;++i)
{
string w; cin>>w;
va.push_back({w,(int)mp2[w].size()});
}
if(!va.size())
{
cout<<"None!";
}
else
{
sort(va.begin(),va.end());
for(int i=0;i<va.size();++i)
{
if(va[i].cnt>=k)
cout<<va[i].s<<":"<<va[i].cnt<<endl;
}
for(auto item:mp2[va[0].s])
{
cout<<a[item-1].s1<<"/"<<a[item-1].s2<<endl;
}
}
}
signed main(void)
{
solve();
return 0;
}