题目链接:http://hihocoder.com/problemset/problem/1829
题目大意:给n个字符串,这n个字符串都是环形的,问这n个字符串的最长公共子序列是什么,如果有多个的话按照字典序从小到大排序
题目思路:直接上去就暴力..每个串每个字母都做一次首字母,然后将每个串的子序列用二进制枚举全都求出来。最后出现过n次的子序列插入vector,按照长度和字典序进行排序,如果没有符合条件的就输出0,有条件的就输出v[0]就好
以下是代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
const int MAXN = 1e5+5;
string s[15];
map<string,int>mp,vis;
vector<string>v;
string change(string s,int pos){
string temp=s.substr(pos);
temp+=s.substr(0,pos);
return temp;
}
void dfs(string t){
vis.clear();
int len=t.length();
int lenn=(1<<len)-1;
rep(k,0,len-1){
string tmp=change(t,k);
rep(i,1,lenn){
string ans="";
rep(j,0,len-1){
if((1<<j)&i){
ans+=tmp[j];
}
}
if(!vis[ans]){
vis[ans]=1;
mp[ans]++;
}
}
}
}
bool cmp(string a,string b){
if(a.length()==b.length())return a<b;
return a.length()>b.length();
}
int main()
{
int n;
while(~scanf("%d",&n)){
mp.clear();
v.clear();
rep(i,1,n){
cin>>s[i];
dfs(s[i]);
}
map<string,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
if(it->second==n){
v.push_back(it->first);
}
}
sort(v.begin(),v.end(),cmp);
if(!v.empty()){
cout<<v[0]<<endl;
}
else{
printf("0\n");
}
}
return 0;
}