本来想到的最暴力的做法是dfs生成第一个串的所有字串, 看是否在成环的其它串上出现过。
但是,被string 搞挂了。。。所以赛后换了枚举状态做。。。
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N = 100;
string str[N];
int len[N];
vector<string>have[N];
int n;
bool checkOne(string p, string s){
int lp = p.length(), ls = s.length();
int o = 0;
for(int i=0;i<ls;i++){
if(p[o] == s[i]) o++;
}
if(o == lp) return true;
else return false;
}
bool checkAll(string s){
for(int i=1;i<n;i++){
bool flag = 1;
for(int j=0;j<have[i].size();j++){
//cout<<have[i][j]<<endl;
if(checkOne(s, have[i][j])){
// cout<<s << " "<<have[i][j]<<endl;
flag = 0;
}
}
if(flag) return false;
}
return true;
}
string ans;
void solve(string ss){
int S = 1<<len[0];
for(int s = 0; s < S; s++){
string tps;
for(int j=0;j<len[0];j++){
if(s & (1<<j)) tps += ss[j];
}
if(checkAll(tps)){
//cout<<tps<<endl;
if(tps.length() > ans.length()){
ans = tps;
}
else if(tps.length()==ans.length() && ans>tps){
ans = tps;
}
}
}
}
int main()
{
while(cin>>n){
ans = "";
for(int i=0;i<15;i++) have[i].clear();
for(int i=0;i<n;i++){
cin>>str[i];
len[i] = str[i].length();
str[i] = str[i] + str[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<len[i];j++){
string tp;
for(int k=0;k<len[i];k++){
tp += str[i][j+k];
}
have[i].push_back(tp);
}
}
for(int i=0;i<len[0];i++){
//cout<<have[0][i]<<endl;
solve(have[0][i]);
}
if(ans.empty() || ans.size() == 0) cout<<0<<endl;
else cout<<ans<<endl;
}
return 0;
}
/*
1
abcdefg
*/
Ps:觉得自己最近状态真的奇差,可能和迷茫有关?哈。。。