Codeforces Round #724 (Div. 2) B. Prinzessin der Verurteilung(暴力枚举)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #724 (Div. 2) B. Prinzessin der Verurteilung(暴力枚举)相关的知识,希望对你有一定的参考价值。
显然 m e x \\rm mex mex不会超过 5 5 5,因为 2 6 5 > n ∗ ( n + 1 ) 2 26^5>\\frac{n*(n+1)}{2} 265>2n∗(n+1)
然后就,枚举一下长度,暴力枚举是否存在该子串就好了
要么用 h a s h + m a p hash+map hash+map判断是否存在,要么用 S A M \\rm SAM SAM判断
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int t,n;
int las = 1, id = 1, zi[maxn][27], fa[maxn], l[maxn];
void insert(int c)
{
int p = las, np = ++id; las = id;
l[np] = l[p]+1;
for( ; p&&zi[p][c]==0 ; p = fa[p] ) zi[p][c] = np;
if( !p ) fa[np] = 1;
else
{
int q = zi[p][c];
if( l[q]==l[p]+1 ) fa[np] = q;
else
{
int nq = ++id;
memcpy( zi[nq],zi[q],sizeof zi[q] );
l[nq] = l[p]+1, fa[nq] = fa[q];
fa[np] = fa[q] = nq;
for( ; p&&zi[p][c]==q;p=fa[p] ) zi[p][c] = nq;
}
}
}
char ans[maxn],a[maxn]; int flag;
bool isok(int len)
{
int u = 1;
for(int i=1;i<=len;i++)
if( zi[u][ans[i]-'a'] ) u = zi[u][ans[i]-'a'];
else return false;
return true;
}
void dfs(int len,int ed)
{
if( flag ) return;
if( len==ed+1 )
{
if( !isok(ed) ) flag = 1;
return;
}
for(int i=0;i<=25;i++)
{
ans[len] = char( i+'a' );
dfs( len+1,ed );
if( flag ) return;
}
}
void init()
{
flag = 0;
for(int i=1;i<=id;i++)
{
memset( zi[i],0,sizeof zi[i] );
l[i] = fa[i] = 0;
}
las = id = 1;
}
int main()
{
cin >> t;
while( t-- )
{
init();
scanf("%d%s",&n,a+1 );
for(int i=1;i<=n;i++) insert( a[i]-'a' );
for(int i=1;i<=5;i++)
{
dfs( 1,i );
if( !flag ) continue;
for(int j=1;j<=i;j++) printf("%c",ans[j] );
break;
}
printf("\\n");
}
}
以上是关于Codeforces Round #724 (Div. 2) B. Prinzessin der Verurteilung(暴力枚举)的主要内容,如果未能解决你的问题,请参考以下文章
E. Omkar and Forest——Codeforces Round #724 (Div. 2)
E. Omkar and Forest——Codeforces Round #724 (Div. 2)
F. Omkar and Akmar游戏,组合,逆元—— Codeforces Round #724 (Div. 2)
Codeforces Round #724 (Div. 2)(CD)