BJ模拟:Circle Of Stone(KMP)

12人阅读 评论(0) 收藏 举报
分类:

传送门

题意:

桌子上有 n个石头围成一个环。每个石头都有一种颜色。每种颜色可以由小写英文字母表示,所以总共有26种颜色。不同的石头可能有相同的颜色。
如果每一对相邻的石头都是不同颜色的,则称这 n 个石头构成的环是美丽的。两个石头是相邻的充要条件是这两个石头中间没有其它石头。
现在,你可以从这 n 个石头中拿走一段连续的石头(可以为空),且你只能拿一次。
你的任务是对于每个k(0kn1) ,判断是否存在一种取石头的方案,使得在拿走 k个连续的石头后,剩下的nk 个石头构成的环是美丽的。

题解:
相邻位置相同把可选的位置变为若干区间,我们对于每个区间单独考虑:

判断k合法等价于判断是否存在长度为nk的子区间使得两端不同,考虑如果不合法,则又等价于任意ai=ai+nk1,即为存在周期nk1

周期和border相对应,利用KMP寻找border,时间复杂度O(n)

#include <bits/stdc++.h>
using namespace std;

const int N=2e6+50;
int n,T,f[N],vis[N],vs,nxt[N],ans[N];
char ch[N],s[N];
inline void solve(int l,int r) {
    int len=r-l+1;
    for(int i=1;i<=len;i++) s[i]=ch[l+i-1];
    for(int i=2,j=0;i<=len;i++) {
        while(j&&s[j+1]!=s[i]) j=nxt[j];
        if(s[j+1]==s[i]) ++j;
        nxt[i]=j;
    }
    ++vs;
    for(int j=nxt[len];j;j=nxt[j]) vis[len-j]=vs;
    for(int j=0;j<len && j<n; ++j) 
        if(vis[j]!=vs) ans[n-j-1]=1;
}
inline void solve() {
    n=strlen(ch+1);
    memcpy(ch+n+1,ch+1,sizeof(char)*n);
    memset(ans,0,sizeof(int)*n);
    for(int i=1,j=1;i<=2*n;i=++j) {
        while(j<2*n && ch[j]!=ch[j+1]) ++j;
        solve(i,j); 
    }
    printf("Case %d: ",++T);
    for(int i=0;i<n;i++) putchar('0'+ans[i]);
    putchar('\n');
}
int main() {
    while(~scanf("%s",ch+1)) solve();
}
查看评论

BJ模拟:stwell(BFS)

从前有一只鸽子。它生活在一个 N×MN \times MN×M 的网格里。网格从 000 开始标号, 有些网格是山,剩下的是平地。 他最开始在(stx,sty)(stx,sty)(stx,sty...
  • qq_35649707
  • qq_35649707
  • 2017-12-10 21:15:25
  • 98

BJ模拟:模型(贪心)

传送门 题意: 给一棵树,求最少需要加多少条边使其点双联通。 题解: 我们可以先考虑如果是割边的话应该怎么做。显然答案下界是⌈l2⌉⌈l2⌉ ⌈\frac{l}{2}⌉ 其中 lll 是树中的...
  • qq_35649707
  • qq_35649707
  • 2018-03-20 18:38:03
  • 34

POJ题目3517 And Then There Was One(约瑟夫,公式)

And Then There Was One Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: ...
  • yu_ch_sh
  • yu_ch_sh
  • 2015-08-14 17:19:17
  • 755

UVa 3882 And Then There Was One(stl+有技巧的模拟||数学方法+约瑟夫问题)

Let’s play a stone removing game. Initially, n stones are arranged on a circle and numbered 1, …, n ...
  • qq_37497322
  • qq_37497322
  • 2017-08-09 10:47:47
  • 427

UVa 3882 - And Then There Was One 递推------------无力orz

Let's play a stone removing game. Initially, n stones are arranged on a circle and numbered 1,..., ...
  • cyendra
  • cyendra
  • 2013-04-24 15:10:14
  • 918

字符串的模拟匹配字符串的模拟匹配kmp

  • 2009年04月24日 20:43
  • 2KB
  • 下载

BJ模拟(1) D1T1 Delight for a Cat

Delight for a Cat 题目背景: thoj22 分析: 首先,如果你没有学习过NOI2008的志愿者招募,请先去A掉那道题这里 首先,假设这只猫在所有天...
  • scar_lyw
  • scar_lyw
  • 2017-03-07 07:24:37
  • 267

BJ模拟(1) D1T1 计数

计数 题目背景: thoj21 分析: 先考虑放置所有的A,要在所有的相邻的A中间进行插入,然后我们考虑插入B,那么之后就会形成..A..B..B..B..A..B..A..B的形式 可以通...
  • scar_lyw
  • scar_lyw
  • 2017-03-06 21:05:35
  • 140

BJ模拟 数列【特征多项式and生成函数】

题目大意: 有数列: fm,n=⎧⎩⎨⎪⎪an,n=1...m∑k=1m(a−1)fm,n−k−1(1)(1)fm,n={an,n=1...m∑k=1m(a−1)fm,n−k−1\begin{...
  • cdsszjj
  • cdsszjj
  • 2018-03-15 10:53:03
  • 44
    个人资料
    持之以恒
    等级:
    访问量: 6万+
    积分: 4574
    排名: 8042
    友情链接
    文章分类