题目

  点这里看题目。

分析

  由于 KMP 的失配数组有着天然的找循环节的功能,因此我们不难想到对原串进行两次 KMP ,一正一反。

  可以发现如下的规律:

  1. 原串无循环节,这个时候 " 全场最佳 " 只会有一个元素,并且只有一个(即原串本身);

  2. 原串存在循环节,并且仅由一个字符循环而成,此时唯一的 " 亮眼表现 " 就是将原串拆分成字符;

  3. 原串存在循环节。可以发现, " 全场最佳 " 只会有两个元素(在一个循环内部进行划分)。我们只需要统计一下划分方式。可以发现,划分方案不会超过\(|S|-1\)个(\(\bmod 10^9+7\)都是骗人的)。我们枚举一下划分位置,并检查一下划分出来的两段有没有循环节即可。(不能直接算 qwq , WA 哭了......)

  时间是\(O(|S|)\)。

代码

#include <cstdio>
#include <cstring>
#include <algorithm> const int MAXN = 5e5 + 5; template<typename _T>
void read( _T &x )
{
x = 0;char s = getchar();int f = 1;
while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
x *= f;
} template<typename _T>
void write( _T x )
{
if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
if( 9 < x ){ write( x / 10 ); }
putchar( x % 10 + '0' );
} char S[MAXN];
int nxt1[MAXN], nxt2[MAXN];
int N; void calc( int *ret )
{
ret[1] = 0;
for( int i = 2, j = ret[1] ; i <= N ; i ++ )
{
while( j && S[i] ^ S[j + 1] ) j = ret[j];
if( S[j + 1] == S[i] ) j ++;
ret[i] = j;
}
} bool chkPre( const int p ) { return nxt1[p] && p % ( p - nxt1[p] ) == 0; }
bool chkSuf( const int p ) { return nxt2[p] && p % ( p - nxt2[p] ) == 0; }
bool chk( const int p ) { return chkPre( p ) == 0 && chkSuf( N - p ) == 0; } int main()
{
scanf( "%s", S + 1 );
N = strlen( S + 1 );
calc( nxt1 ), std :: reverse( S + 1, S + 1 + N ), calc( nxt2 );
if( nxt1[N] && N % ( N - nxt1[N] ) == 0 )
{
if( nxt1[N] == N - 1 ) { printf( "%d\n%d\n", N, 1 ); return 0; }
puts( "2" ); int ans = 0;
for( int i = 1 ; i < N ; i ++ )
ans += chk( i );
write( ans ), putchar( '\n' );
}
else puts( "1\n1" );
return 0;
}

[ARC060D] 最良表現的更多相关文章

  1. 【Atcoder ARC060F】最良表現 / Best Representation

    Atcoder ARC060 F 题意:给一个串,求将其分成最少的没有循环节的串的种数. 思路:先求KMP的\(fail\)数组.然后发现最少的串数只有三种可能:\(1\).\(2\).\(n\). ...

  2. AtCoder 瞎做

    目录 ARC 058 E - 和風いろはちゃん / Iroha and Haiku 题意 题解 技巧 代码 ARC 059 F - バイナリハック / Unhappy Hacking 题意 题解 技巧 ...

  3. AtCoder-arc060 (题解)

    A - 高橋君とカード / Tak and Cards (DP) 题目链接 题目大意: 有 \(n\) 个数字,要求取出一些数字,使得它们的平均数恰好为 \(x\) ,问有几种取法. 大致思路: 只要 ...

  4. csp退役前的做题计划1(真)

    csp退役前的做题计划1(真) 因为我太菜了,所以在第一次月考就会退役,还是记录一下每天做了什么题目吧. 任务计划 [ ] Z算法(Z Algorithm) 9.28 [x] ARC061C たくさん ...

  5. 【AtCoder】ARC060

    ARC060 C - 高橋君とカード / Tak and Cards 每个数减去A,然后转移N次,每次选或不选,最后是和为0的时候的方案数,负数可以通过把所有数右移2500做到 #include &l ...

  6. AtCoder Regular Contest 060

    C - 高橋君とカード / Tak and Cards 思路:dp,先说说我想的,我写的dp数组是dp[i][j][k],表示从前i个数字中,选择j个数字,平均值为k,则dp[i][j][k] = d ...

  7. 【Fate/kaleid liner 魔法少女☆伊莉雅】系列中实践的、新世代的动画摄影工作流

          通常的日本动画的摄影中,是以追加Cell(celluloid 赛璐珞)与背景的合成滤镜处理为主,而在[Fate/kaleid liner 魔法少女☆伊莉雅]系列的,加入了自己使用3DCG软 ...

  8. Windows PowerShell 入門(5)-制御構文

    Windows PowerShellにおける制御構文について学びます.数ある制御構文の中でもSwitch文は.他の言語に比べ豊富な機能が用意されています. 対象読者 Windows PowerShel ...

  9. Windows PowerShell 入門(4)-変数と演算子

    Windows PowerShellにおける変数と演算子の使用方法について学びます.今回は代表的な演算子として.算術演算子.代入演算子.論理演算子.比較演算子.範囲演算子.置換演算子.ビット演算子.型 ...

随机推荐

  1. php RSA和AES加密算法

    一.RSA加密 RSA只说PHP中的应用,详细的算法原理解释,请自行百度,或者参考(RSA加密算法-详细解释以及公钥加密为什么每次都不一样) 总结:公钥加密.私钥解密.私钥签名.公钥验签. 注意: 1 ...

  2. jsp循环map map的key值不固定

    <c:if test="${not empty parammap}"> <c:forEach items="${parammap }" var ...

  3. sql语句 怎么从一张表中查询数据插入到另一张表中?

    sql语句 怎么从一张表中查询数据插入到另一张表中?  ----原文地址:http://www.phpfans.net/ask/MTc0MTQ4Mw.html 比如我有两张表 table1 字段 un ...

  4. [Objective-C] 013_文件系统(File System)

    在前面三篇关于数据持久化,我们都用涉及到文件(plist文件,数据库文件),它们都是把它们存储在document目录下.iOS的文件机制是沙盒机制,应用只能访问自己应用目录下的文件.iOS应用产生的内 ...

  5. 此flash player与您的地区不相容——更换新版本edge后出现的问题

    最新切换到了edge浏览器,使用flash时提示:"此flash player与您的地区不相容",而chrome是没有问题的.网上找到解决方案,发现一个可以有效解决的方式,如下: ...

  6. 实用教程丨使用K3s和MySQL运行Rancher 2.4

    本文转自Rancher Labs 简 介 本文将介绍在高可用K3s Kubernetes集群上安装Rancher 2.4的过程并针对MySQL利用Microsoft Azure数据库的优势,该数据库消 ...

  7. PowerPC-MPC56xx 启动模式

    https://mp.weixin.qq.com/s/aU4sg7780T3_5tJeApFYOQ   参考芯片参考手册第5章:Chapter 5 Microcontroller Boot   The ...

  8. python(3.x)自动化全栈开发100天集训计划(跟上进度,到一个新高度)——day1

            Day1 目录: Python介绍 * 了解Python的特点.发展史 * 介绍Python广泛的应用领域和前景 第一个Python程序 * 掌握Python代码的2种执行方式 变量 ...

  9. Java实现 LeetCode 796 旋转字符串 (水题)

    796. 旋转字符串 给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转 ...

  10. ASP.NET给图片自动添加水印

    先建一个类,感觉注释已经很详细了,有不懂的欢迎评论 using System; using System.Collections.Generic; using System.Drawing; usin ...