[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 ...
随机推荐
- Cocos2dx源码赏析(3)之事件分发
Cocos2dx源码赏析(3)之事件分发 这篇,继续从源码的角度赏析下Cocos2dx引擎的另一模块事件分发处理机制.引擎的版本是3.14.同时,也是学习总结的过程,希望通过这种方式来加深对Cocos ...
- iOS 模块化、组件化方案探索(利用cocoapods 、git 创建私有仓库)
来自bang's blog http://blog.cnbang.net/tech/3080/ 模块化 简单来说,模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能 ...
- 完整Highchart JS示例
线性: $.ajax({ type:'post', url:appPages.urlListTjrll, cache:false, data:{year:year,month:month},// // ...
- VS code MacOS 环境搭建
环境:MacBook Pro 参考博客 为了动手开发AI代码,我需要安装一个VS code. 开始我以为是安装visual studio呢.我装过visual studio2017. VS code是 ...
- 第10章 系统级I/O(下)
10.7 I/O重定向 Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输出输入联系起来. 例如:unix>ls>foo.txt,使得外壳加载和执行ls程序,将标准输出重定 ...
- Sprint计划表
Sprint会议计划 一.Sprint 需求 准备环节:小组成员利用周六周日在网上查阅Android开发的教程,练习开发一些简单的小程序,具备一定的开发能力,在电脑上搭建Android开发环境,做好 ...
- 《Spring2之站立会议7》
<Spring2之站立会议7> 昨天,查相关资料解决debug:: 今天,解决了debug: 遇到问题,一些问题是得到解决了,但是一些还未被解决.
- 福大软工1816 · 评分结果 · Alpha冲刺
作业地址:alpha冲刺1.alpha冲刺2.alpha冲刺3.alpha冲刺4.alpha冲刺5.alpha冲刺6.alpha冲刺7.alpha冲刺8.alpha冲刺9.alpha冲刺10 作业提交 ...
- 【贪心算法】POJ-1017
一.题目 Description A factory produces products packed in square packets of the same height h and of th ...
- vue.js常用指令
本文摘自:http://www.cnblogs.com/rik28/p/6024425.html Vue.js的常用指令 上面用到的v-model是Vue.js常用的一个指令,那么指令是什么呢? Vu ...