[Codeforces Gym] 100162B Circle of Stones
题意:
桌子上有 n 个石头围成一个环。每个石头都有一种颜色。每种颜色可以由小写英文字母表示。如果每一对相邻的石头都是不同颜色的,则称这 n 个石头构成的环是美丽的。现在,你可以从这 n 个石头中拿走一段连续的石头(可以为空),且你只能拿一次。
对于每个 k(0≤k≤n−1) ,判断是否存在一种取石头的方案,使得在拿走 k 个连续的石头后,剩下的 n−k 个石头构成的环是美丽的。
n<=1000000
正解kmp,转换思路,不去考虑拿走什么,考虑留下什么,不去考虑什么合法,去考虑哪些是违法的。
显然如果a[i]=a[i+1],a[i]与a[i+1]一定不能同时留下,所以我们可以将序列切成很多段,在每一段中,如果留下长度k不合法,那么说明k-1是它的一个循环节,因为不合法只能是头尾相同,即a[i]=a[i+k-1],如果对于每个位置都满足,那么说明k-1是串的一个循环节(不要求乘除)。
每一段求完再求个并就好了。
next数组一定要从1开始!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000005
using namespace std;
char s[N*];
int nxt[*N],ans[*N];
int n;
void solve(int l,int r)
{
nxt[]=;int k=;
for(int i=l+;i<=r;i++)
{
while(k&&s[k+l]!=s[i])k=nxt[k];
if(s[k+l]==s[i])k++;
nxt[i-l+]=k;
}
int len=(r-l+);
for(int i=;i<=len;i++)ans[i]++;
while(k)
{
ans[len-k+]--;
k=nxt[k];
}
return ;
}
int main()
{
int tot=;
while(~scanf("%s",s))
{
n=strlen(s);
memset(ans,,sizeof(ans));
memset(nxt,,sizeof(nxt));
for(int i=;i<n;i++)s[i+n]=s[i];
int pre=;
for(int i=;i<*n;i++)
{
if(s[i]==s[i-])
{
solve(pre,i-);
pre=i;
}
}
solve(pre,*n-);
printf("Case %d: ",++tot);
for(int i=;i<=n-;i++)
{
if(ans[n-i])putchar('');
else putchar('');
}
puts("");
}
return ;
}
[Codeforces Gym] 100162B Circle of Stones的更多相关文章
- Codeforces Gym 101252D&&floyd判圈算法学习笔记
一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
- Codeforces Gym 101623A - 动态规划
题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...
- 【Codeforces Gym 100725K】Key Insertion
Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...
- Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】
2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...
- codeforces gym 100553I
codeforces gym 100553I solution 令a[i]表示位置i的船的编号 研究可以发现,应是从中间开始,往两边跳.... 于是就是一个点往两边的最长下降子序列之和减一 魔改树状数 ...
- CodeForces Gym 100213F Counterfeit Money
CodeForces Gym题目页面传送门 有\(1\)个\(n1\times m1\)的字符矩阵\(a\)和\(1\)个\(n2\times m2\)的字符矩阵\(b\),求\(a,b\)的最大公共 ...
- Codeforces GYM 100876 J - Buying roads 题解
Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...
- Codeforces Gym 100463D Evil DFS
Evil Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Descr ...
随机推荐
- Sqlmap常用命令大全
1 Options(选项) -h,--help 显示帮助消息-hh 显示详细帮助-version -v VERBOSE 详细级别 0-6 默认12 Target 目标-u URL--url=URL-g ...
- NuGet 让程序集版本变得混乱
之前引用的 System.Net.Http.Formatting ,是依赖于 System.Net.Http 2.0的. 更新引用后它是依赖于 System.Net.Http 4.0 的.而且一 ...
- chown命令详情
基础命令学习目录首页 原文链接:https://www.jb51.net/article/98255.htm chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名 ...
- Hadoop Streaming框架使用(二)
上一篇文章介绍了Streaming的各种参数,本文具体介绍使用方法. 提交hadoop任务示例: $HADOOP_HOME/bin/hadoop streaming \ -input /user/te ...
- The serializable class XXX does not declare a static final serialVersionUID field of type long的警告
原文: http://blog.csdn.net/ultrakang/article/details/41820543
- C++ 类的定义与实现
摘自这篇博客https://blog.csdn.net/xulingxin/article/details/81335030 一."类" 的介绍 在C++中, 用 &q ...
- [2019BUAA软件工程]第0次个人作业
我 & 计算机 写在前面 撰写本博客时,笔者正就读北航计算机系大三下的软件工程课程.借由这次博客作业的机会,笔者从高考时与计算机专业结缘.大学对计算机的学习以及对未来的计划三方面进行了些许 ...
- 实验五Java网络编程及安全
实验五 Java网络编程及安全 结对伙伴:20135231林涵锦(负责服务器方)http://www.cnblogs.com/20135213lhj/ 实验目的与要求: 1.掌握Java网络编程的方 ...
- Mysql中实现递归查询
1.常规表字段 id,pid,lev,name 2.sql语句 DELIMITER // DROP PROCEDURE IF EXISTS Pro_GetColumnOrg//CREATE PROCE ...
- SDWebImage缓存图片的机制
SDWebImage是一个很厉害的图片缓存的框架.既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者对于图 ...