给定 𝑛n 个字符串,你需要找到最长的「完美单词」。
字符串 𝑡t 称为「完美单词」,当且仅当它的所有非空子串都出现在给定的字符串中。
字符串 𝑠s 称为 𝑡t 的子串,当且仅当 𝑠s 可由 𝑡t 在开头和结尾分别删去零个或若干个字符得到。
1≤𝑛≤1051≤n≤105,字符串仅由小写字母组成,且总长不超过 105105。
输入格式
第一行一个整数 𝑛n。
接下来 𝑛n 行,每行一个字符串。
输出格式
输出一行一个整数表示最长的「完美单词」的长度。
输入输出样例
输入 #1复制
4 a t b ab
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
string s[N];
map<string,bool> m;
bool check(string s)
{
for (int i=0; i<s.size(); i++)
{
for (int len=1; len<=s.size()-i+1; len++)
{
// cout<<s.substr(i,len)<<' ';
if (!m[s.substr(i,len)])
{
return false;
}
}
}
return true;
}
bool cmp(string a,string b)
{
return a.size()>b.size();
}
int main()
{
int n;
cin>>n;
for (int i=1; i<=n; i++)
{
cin>>s[i];
m[s[i]]=true;
}
sort(s+1,s+1+n,cmp);
//cout<<s[1]<<"ddd";
for (int i=1; i<=n; i++)
{
// cout<<'\n';
if (check(s[i]))
{
cout<<s[i].size();
break;
}
}
return 0;
}
/*#include "bits/stdc++.h"
using namespace std;
int main()
{
string a="asdfgh";
cout<<a.substr(0,1);
为a;
}
*/