1. 程式人生 > >acm 2018北京網路賽B題

acm 2018北京網路賽B題

這個題的題意就是給n n<=10個字串,長度不超過8,但是n個字串每一個都可以組成一個環,然後求這n個字串的最長公共子序列

我的做法就是使用位運算遍歷。(朱學長要打我....)就是每一位就是一個0 1,來遍歷,這樣就比for迴圈遍歷快很多,然後分別使用map來存同時要避免在每個字串中子串出現次數大於1,然後再用另一個map來存一下,最後在輸出最後的map就可以了

#include<bits/stdc++.h>
using namespace std;
char str[11][20];
char s1[105];
char s2[105];
int length[11];
map<string,int>mp[10];
map<string,int>ansmp;
int main()
{
    int n,i,j,k;

    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<10; ++i)
            mp[i].clear();
        int minn=0;
        for(i=0; i<n; i++)
        {
            scanf("%s",str[i]);
        }
        for(int i=0; i<n; ++i)
        {
            int len=strlen(str[i]);
            length[i]=len;
            for(int j=0; j<len; ++j)
                str[i][j+len]=str[i][j];
            str[i][2*len]='\0';
        }
        char str1[9];
        string tempstr;
        for(int i=0; i<n; ++i)
        {
            for(int j=0; j<length[i]; ++j)
            {
                for(int num=1; num<(1<<8); ++num)
                {
                    int temp=num;
                    int count1=0,k=0;
                    while(temp)
                    {
                        if(temp&1)
                        {
                            str1[k++]=str[i][j+count1];
                        }
                        temp>>=1;
                        count1++;
                    }
                    str1[k]='\0';
                    tempstr=str1;
                    //cout<<tempstr<<endl;
                    mp[i][tempstr]=1;

                }
            }
        }
        for(int i=0; i<n; ++i)
        {
            for(map<string,int>::iterator it=mp[i].begin(); it!=mp[i].end(); it++)
            {
               // cout<<(it->first)<<"FFFF"<<endl;
                ansmp[it->first]++;
            }
        }
        string ansstring;
        int maxlen=-1;
        for(map<string,int>::iterator it=ansmp.begin(); it!=ansmp.end(); ++it)
        {
            if(it->second==n)
                ansstring=it->first;

        }
        cout<<ansstring<<endl;

    }
    return 0;
}
/*
2
asdffcxaa
adfxfa
*/