东华大学复试基础题 94 求字符串的起始位置

                92 字符串统计

        作者: SunCiHai时间限制: 10S章节: 字符串

明明最近在做一个有关字符串的统计工作。两个由小写字母组成的字符串s1和s2,明明需要统计出以下四种关系:

(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);

(2)在s1中且在s2中的字母;

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;

(4)不在s1中且也不在s2中的字母;

例如两个字符串s1为“lkjsvoahs”,s2为“qglhskjdfg”:

(1)在s1或者在s2或者s1、s2中都存在的字母:adfghjkloqsv;

(2)在s1中且在s2中的字母:hjkls;

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母:adfgoqv;

(4)不在s1中且也不在s2中的字母:bceimnprtuwxyz;

明明统计了很久,但是由于统计过程十分繁琐,且很容易出错,导致明明的进度非常慢,很有可能因为统计不完而错过了晚上的约会。因此明明想请你帮个忙,帮他写一个程序,用程序来统计出以上几项内容。

明明的问题可以归结为:

输入两串由小写字母组成的字符串s1和s2,比较其中的字母,输出以下四项,输出的字母以字典顺序排列:

(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);

(2)在s1中且在s2中的字母;

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;

(4)不在s1中且也不在s2中的字母;

例如字符串s1为sadf,s2为asdf,则需输出以下四行(注意输出的格式):

in s1 or s2:adfs

in s1 and s2:adfs

in s1 but not in s2 ,or in s2 but not in s1:

not in s1 and s2:bceghijklmnopqrtuvwxyz

#include<bits/stdc++.h>
#include<bitset>
#include<unordered_map>
#define pb push_back
#define bp __builtin_popcount
#define TIME cout << "RuningTime: " << clock() << "ms\n", 0
#define ls x<<1
#define rs x<<1|1
using namespace std;
typedef  long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1e6+10;
const int MOD=9901;
const int mod = 1e9+7;
const double PI=3.14;
int lowbit(int x){return x&-x;}
ll gcd(ll x, ll y){ return y == 0 ? x : gcd(y, x%y); }
ll lcm(ll x, ll y){ return x / gcd(x, y)*y; }
inline ll dpow(ll a, ll b){ ll r = 1, t = a; while (b){ if (b & 1)r = (r*t) % MOD; b >>= 1; t = (t*t) % MOD; }return r; }
inline ll fpow(ll a, ll b,ll p){ ll r = 1, t = a; while (b){ if (b & 1)r = (r*t) % p; b >>= 1; t = (t*t) % p; }return r; }
priority_queue<int, vector<int>, greater<int> > q;


int main()
{

    string s1,s2;


    while(cin>>s1>>s2)
    {
        int num[27];

        memset(num,0,sizeof num);




        set<char>se1,se2;



        for(int  i=0;i<s1.length();i++)
        {
            se1.insert(s1[i]);

            num[s1[i]-'a'+1]++;
        }


        for(int  i=0;i<s2.length();i++)
        {
             se2.insert(s2[i]);
            num[s2[i]-'a'+1]++;
        }


        vector<char>v;
        for(int  i=0;i<s1.length();i++)
            v.push_back(s1[i]);

        for(int  i=0;i<s2.length();i++)
            v.push_back(s2[i]);

        sort(v.begin(),v.end());
        cout<<"in s1 or s2:";
        for(int i=0;i<v.size();i++)
        {
            if(i==0)cout<<v[i];
            else if(v[i]==v[i-1])continue;
            else cout<<v[i];
        }

        cout<<endl;

        cout<<"in s1 and s2:";

        vector<char>a;
        for(int i=0;i<s1.length();i++)
        {
            if(se2.count(s1[i]))
               a.push_back(s1[i]);
        }

        sort(a.begin(),a.end());


          for(int i=0;i<a.size();i++)
        {
            if(i==0)cout<<a[i];
            else if(a[i]==a[i-1])continue;
            else cout<<a[i];
        }

        cout<<endl;


        cout<<"in s1 but not in s2 ,or in s2 but not in s1:";

        vector<char>b;


        for(int i=0;i<s1.length();i++)
        {
            if(!se2.count(s1[i]))//在s1但是不在s2
            b.push_back(s1[i]);
        }

        for(int i=0;i<s2.length();i++)
        {
            if(!se1.count(s2[i]))
                b.push_back(s2[i]);

        }
        
        sort(b.begin(),b.end());

        for(int i=0;i<b.size();i++)
        {
            if(i==0)cout<<b[i];
            else if(b[i]==b[i-1])continue;
            else cout<<b[i];
        }

        cout<<endl;

        cout<<"not in s1 and s2:";

        for(int i=1;i<=26;i++)
        {
            if(num[i]==0)cout<<char('a'+i-1);
        }
       cout<<endl;


       cout<<endl;







    }
















    return 0;
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值