1. 程式人生 > >898 C. Phone Numbers

898 C. Phone Numbers

set ber 所有 one substr() tor pac sync 構造

傳送門

[http://codeforces.com/contest/898/problem/C]

題意

題意比較難理解直接看樣例就知道了,給你個n接下來n行,每行包括一個名字和號碼的數量,還有具體的每個號碼
讓你整理他的電話本,使得一個人的號碼不能有重復,而且一個號碼不能是另一個號碼的後綴

分析

首先可以對一個人的所有號碼去重,用map<string,set<string>> m來存信息可以,set具有惟一性,然後輸出m.size()即為所有聯系人
然後用三重循環來處理使得一個人的號碼不能有重復,而且一個號碼不能是另一個號碼的後綴,關鍵是判斷一個字符串是否是另一個字符串的
後綴,substr()函數
1. 用途:一種構造string的方法

2. 形式:s.substr(pos, n)

3. 解釋:返回一個string,包含s中從pos開始的n個字符的拷貝(pos的默認值是0,n的默認值是s.size() - pos,即不加參數會默認拷貝整個s)

4. 補充:若pos的值超過了string的大小,則substr函數會拋出一個out_of_range異常;若pos+n的值超過了string的大小,則substr會調整n的值,只拷貝到string的末尾

例如:

#include<string>
#include<iostream>
using namespace std;
int main()
{
  string s("12345asdf");
  string a = s.substr(0,5);     //獲得字符串s中從第0位開始的長度為5的字符串
  cout << a << endl;
}
輸出結果為:12345

本題代碼

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //freopen("in.txt","r",stdin);
    while(cin>>n){
        map<string,set<string> > m;
        int num;
        string name;
        for(int i=0;i<n;i++){
            cin>>name>>num;
            string s;
            for(int j=0;j<num;j++){
                cin>>s;
                m[name].insert(s);
            }
        }
        cout<<m.size()<<endl;
        for(map<string,set<string> >::iterator it=m.begin();it!=m.end();it++){
            string name=(*it).first;
            vector<string> v;
            for(set<string>::iterator at=m[name].begin();at!=m[name].end();at++){
                string a=*at;
                bool flag=1;
                for(set<string>::iterator bt=m[name].begin();bt!=m[name].end();bt++){
                    string b=*bt;
                    if(a==b||a.length()>b.length()) continue;
                    if(b.substr(b.length()-a.length(),a.length())==a)
                    {
                        flag=0; break;
                    }
                }
                if(flag) v.push_back(a);
            }
            cout<<name<<‘ ‘<<v.size()<<‘ ‘;
            for(int i=0;i<v.size();i++)
            cout<<v[i]<<‘ ‘;
            cout<<endl;
        }
    }
    return 0;
}

898 C. Phone Numbers