589
A:hash一下,然后判断是否相等即可
#include<map> #include<set> #include<iostream> #include<vector> #include<cstdio> using namespace std; typedef long long ll; const string S="bmail.com"; string s; set<ll> used; map<ll,vector<string> > mp1; map<ll,ll> mp; int n; ll Hash(bool f,string s) { ll x=0; bool flag=false; for(int i=0;i<s.length();i++) { if(s[i]=='+'&&f) flag=true; if(s[i]=='@'&&f) { flag=false; f=false; } if(flag||(s[i]=='.'&&f)) continue; x*=1071; x+=(int)(s[i]); } // cout<<x<<endl; return x; } void go(string s) { bool flag=true; int pos; for(int i=0;i<s.length();i++) { if(s[i]=='@') { pos=i;break; } } string temp_s=s; for(int i=0;i<s.length();i++) { if(s[i]>='A'&&s[i]<='Z') s[i]=(char)(s[i]+('a'-'A')); } for(int i=pos+1;i<s.length();i++) { if(i-pos>S.length()||s[i]!=S[i-pos-1]) { flag=false; break; } } // cout<<flag<<endl; // cout<<s<<endl; ll temp=Hash(flag,s); mp1[temp].push_back(temp_s); mp[temp]++; } int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++) { cin >> s; go(s); } printf("%d\n",mp1.size()); for(map<ll,vector<string> >::iterator it=mp1.begin();it!=mp1.end();it++) { cout<<mp[it->first]; for(int i=0;i<mp1[it->first].size();i++) { cout<<" "<<mp1[it->first][i]; } cout<<endl; } return 0; }
F:二分答案,然后枚举每一秒,注意,贪心时应以结束时间作为标准,否则就会错掉,坑了很长时间
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> using namespace std; typedef pair<int,int> pii; typedef pair<int,pair<int,int> > piii; struct data { int a,b,l; }x[110]; struct type { int len,l,r; }; int n,len; priority_queue<piii,vector<piii>,greater<piii> > q; inline bool cp(data x,data y) { if(x.a!=y.a) return x.a<y.a; return x.b<y.b; } inline int Max(int x,int y) { return x>y?x:y; } bool C(int l) { int pos=1; for(int i=0;i<=len+1;i++) { while(x[pos].a==i-1) { piii temp; temp.first=x[pos].b; temp.second.first=l; temp.second.second=x[pos].b; q.push(temp);pos++; } if(q.empty()) continue; piii temp=q.top();q.pop(); if(i<=temp.second.second) { temp.second.first--; if(temp.second.first!=0) q.push(temp); } else return false; } return q.empty(); } int main() { scanf("%d",&n); memset(x,-2,sizeof(x)); for(int i=1;i<=n;i++) { scanf("%d%d",&x[i].a,&x[i].b); x[i].l=x[i].b-x[i].a; len=Max(len,x[i].b); } sort(x+1,x+n+1,cp); int l=0,r=10000,mid,ans=0; while(l<r-1) { mid=(l+r)/2; while(!q.empty()) q.pop(); if(C(mid)) { l=mid; ans=mid; } else r=mid; } if(C(ans+1)) ans++; if(C(ans+1)) ans++; printf("%d\n",ans*n); return 0; }