2018.09.18 atcoder Best Representation(kmp)
传送门
思路简单不知为何调试了很久。
显然要么分成n个(所有字符相同),要么分成1个(原字符串无循环节),要么分成两个(有长度至少为2的循环节)。
一开始以为可以直接hash搞定。
后来wa了几次之后发现可以轻松举出反例于是弃了hash。
kmp大法好啊,判完循环节之后直接枚举两个子串的断点判是不是前缀与后缀同时满足条件就行了。
代码:
#include<bits/stdc++.h>
#define N 500005
#define mod 1000000007
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
char s[N],t[N];
int n,flag,pre[N],suf[N],ans=0;
void getfail(int *fail,char *s)
{
	fail[0]=-1;
	int j=0;
	for(int i=1;i<n;++i){
		while(j&&s[i]!=s[j])j=fail[j];
		if(s[i]==s[j])fail[i+1]=++j;
		else fail[i+1]=0;
	}
}
inline bool checkpre(int pos){return pre[pos]==0||pos%(pos-pre[pos]);}
inline bool checksuf(int pos){return suf[pos]==0||pos%(pos-suf[pos]);}
int main(){
	scanf("%s",s),n=strlen(s);
	for(int i=0;i<n;++i)t[i]=s[n-i-1];
	getfail(pre,s),getfail(suf,t),t[n]='\0';
	flag=checkpre(n)?1:2;
	bool f=true;
	for(int i=1;i<n;++i)if(s[i]!=s[i-1]){f=false;break;}
	if(f)flag=n;
	cout<<flag<<'\n';
	if(flag!=2){cout<<1;return 0;}
	for(int i=0;i<n;++i){
		int tmp=n-i-1;
		if(checkpre(i+1)&&checksuf(tmp))++ans;
	}
	cout<<ans;
	return 0;
}
												
											2018.09.18 atcoder Best Representation(kmp)的更多相关文章
- 2018.09.18 atcoder Many Formulas(搜索)
		
传送门 感觉自己搜索能力退化了,这种弱智搜索写了整整5min,这样下去比赛会凉的. 看来得多练练题了. 代码: #include<bits/stdc++.h> #define ll lon ...
 - 2018.09.20 atcoder 1D Reversi(模拟)
		
传送门 考虑每次摆石头都会消去最外层的一个连续颜色串. 所以只用统计一下有多少段颜色即可. 代码: #include<bits/stdc++.h> using namespace std; ...
 - 2018.09.17 atcoder  Digit Sum(数论)
		
传送门 数论好题啊. 首先对于b<=sqrt(n)b<=sqrt(n)b<=sqrt(n)的情况直接枚举b判断一下就行了. 下面谈一谈如何解决b>sqrt(n)b>sqr ...
 - 2018.09.16 atcoder Garbage Collector(贪心)
		
传送门 昨晚打比赛的时候不是很机智啊. 这道题贪心就能过了. 我们可以发现一个明显的结论,每次选的垃圾的距离从大到小排序之后,每个距离对答案的贡献的系数是5,5,7,9,11-也就是最远的是5,其余都 ...
 - 2018.12.18 bzoj2242: [SDOI2011]计算器(数论)
		
传送门 数论基础题. 对于第一种情况用快速幂,第二种用exgcdexgcdexgcd,第三种用bsgsbsgsbsgs 于是自己瞎yyyyyy了一个bsgsbsgsbsgs的板子(不知道是不是数据水了 ...
 - 2018.08.18 NOIP模拟 travel(贪心)
		
Travel 题目背景 SOURCE:NOIP2015-SHY4 题目描述 小 A 要进行一次旅行.这回他要在序号为 1 到 n 的 n 个城市之间旅行.这 n 个城市之间共有 m 条连接两个城市的单 ...
 - 2018.07.12 atcoder  Go Home(贪心)
		
传送门 题意简述:大家在数轴上生活,公司在 s. 班车送所有人回家,有 n 个住处,第 i 个位置在 xi,居住了 pi 的人. 保证 xi 互不相同. 大家⼀起投票向前还是向后,如果票数相同就固定向 ...
 - 【2018.10.18】CXM笔记(动态规划)
		
1.给你一棵树,让你修任意多条点不相交的铁路(每条铁路都是一根链),定义一个点的代价为它到根节点的路径中不在铁路上的边数,求一种设计方案代价最大的点最小. 铁路点不相交与 每个点连出去的铁路条数 $\ ...
 - 2018.09.25 bzoj1856: [Scoi2010]字符串(组合数学)
		
传送门 如果有n==m的条件就是卡特兰数. 但现在n不一定等于m. 我们可以考虑用求卡特兰数一样的方法来求答案. 我们知道有一种求卡特兰数的方法是转到二维平面求答案. 这道题就可以这样做. 我们将这个 ...
 
随机推荐
- VSS SVN GIT SVN 加锁签出
			
VSS TFS SVN GIT VSS 两大功能: 1.签出后加锁,别人不能签出,独占签出. 2.在服务端可以查看哪些用户签出了哪些文件. 3.查看所有签出未签入的文件列表,SVN未发现此功能. 缺点 ...
 - java ee7 软件安装和环境配置
			
1. java ee sdk 最新版下载地址 Java EE软件开发包(Software Development Kit, SDK) http://www.oracle.com/technetwork ...
 - Maven 项目中 添加自己的jar包
			
mvn install:install-file -Dfile=java-bloomfilter-1.0.jar -DgroupId=com.sina -DartifactId=java-bl ...
 - UI5-文档-4.23-Custom Formatters
			
如果希望对数据模型的属性进行更复杂的格式化逻辑,还可以编写自定义格式化函数.现在我们将使用自定义格式化程序添加本地化状态,因为数据模型中的状态是一种相当技术性的格式. Preview A status ...
 - 递归实现tree JQuery
			
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
 - mongodb基础学习8-复制集
			
今天来简单学习一下复制集(replication),什么是复制集呢,类似于mysql的主从复制吧 简单来说就是有多个mongodb的实例,多个实例有相同的内容,其中一台用于读写,其它用于备份,当用于读 ...
 - 一本很好的书LearnOpenGL
			
这本书好像不怎么出名,但读起来非常易懂,知识全面 https://learnopengl.com/Advanced-Lighting/Normal-Mapping 基于物理的渲染 – 理论篇 < ...
 - 吴裕雄 数据挖掘与分析案例实战(10)——KNN模型的应用
			
# 导入第三方包import pandas as pd # 导入数据Knowledge = pd.read_excel(r'F:\\python_Data_analysis_and_mining\\1 ...
 - scala sparseVetor, SprseMatrix 实现
			
def rand(seed:Int):Double={ val rand=new Random(seed) rand.nextDouble()} def rand2(size:Int,seed:Int ...
 - Dubbo 分布式服务框架
			
要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微 ...