有解的条件:
- \(s_i=s_{n-i}\)
- \(s_1=1,s_n=0\)
大小为 \(k\) 的菊花图的连通块大小只可能为 \(1\) 或 \(k-1\)
我们可以构造一条菊花链,\(s_i=1\) 的点作为链上的点,不妨记为 \(q_1 \sim q_m\)
运用差分的思想,在每个点下方接恰好 \(q_i-q_{i-1}\) 个点。
这样切菊花边只会得到 \(1\) 和 \(n-1\) 连通块,切链边恰好满足大小。
#include <cstdio>
#include <cstring>
const int MAXN = 1e5;
int n; char s[ MAXN + 5 ];
int main( ) {
scanf("%s", s + 1 ); n = strlen( s + 1 );
if( s[ 1 ] == '0' ) { puts("-1"); return 0; } s[ 0 ] = '0';
for( int i = 1 ; i <= n ; i ++ ) if( s[ i ] != s[ n - i ] ) { puts("-1"); return 0; }
int lst = 0;
for( int i = 1 ; i <= n ; i ++ ) {
if( s[ i ] == '1' ) {
if( lst ) {
printf("%d %d\n", lst , i );
for( int j = lst + 1 ; j < i ; j ++ ) printf("%d %d\n", i , j );
}
lst = i;
}
}
printf("%d %d\n", lst , n );
return 0;
}