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;
}

 

posted @ 2016-11-11 15:15  19992147  阅读(167)  评论(0编辑  收藏  举报