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
*/