zoukankan      html  css  js  c++  java
  • 【BZOJ3620】似乎在梦中见过的样子 KMP

    【BZOJ3620】似乎在梦中见过的样子

    Description

    “Madoka,不要相信 QB!”伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约.
    这是 Modoka 的一个噩梦,也同时是上个轮回中所发生的事.为了使这一次 Madoka 不再与 QB签订契约,Homura 决定在刚到学校的第一天就解决 QB.然而,QB 也是有许多替身的(但在第八话中的剧情显示它也有可能是无限重生的),不过,意志坚定的 Homura 是不会放弃的——她决定
    消灭所有可能是 QB 的东西.现在,她已感受到附近的状态,并且把它转化为一个长度为 n 的字符串交给了学 OI 的你.
    现在你从她的话中知道 , 所有形似于 A+B+A 的字串都是 QB 或它的替身 , 且len(A)>=k,len(B)>=1 (位置不同其他性质相同的子串算不同子串,位置相同但拆分不同的子串算同一子串),然后你必须尽快告诉 Homura 这个答案——QB 以及它的替身的数量.

    Input

    第一行一个字符串,第二行一个数 k

    Output

    仅一行一个数 ans,表示 QB 以及它的替身的数量

    Sample Input

    【样例输入 1】
    aaaaa
    1
    【样例输入 2】
    abcabcabc
    2

    Sample Output

    【样例输出 1】
    6

    【样例输出 2】
    8

    HINT

    对于 100%的数据:n<=15000 , k<=100,且字符集为所有小写字母

    题解:15000跑n^2的题真是少见了。

    由于每个子串都是某个后缀的前缀,所以我们枚举每个后缀,然后我们要求就是:每个前缀的最长前缀后缀,且满足该前缀和后缀不能挨上。是不是想到了动物园那题?

    其实思想非常简单,先求next数组,然后用val[i]表示前缀i的满足要求的最长前缀后缀。求val的过程和next类似,只需要在判相等时再判一下长度限制即可。最终统计的就是val[i]>=k的个数。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    const int maxn=100010;
    int n,m,ans;
    char str[maxn];
    int next[maxn],val[maxn];
    int main()
    {
    	int i,j,k;
    	scanf("%s%d",str,&m),n=strlen(str);
    	for(i=0;i<n;i++)
    	{
    		j=i,next[i]=k=i-1;
    		while(j<n)
    		{
    			if(k==i-1||str[j]==str[k])	next[++j]=++k;
    			else	k=next[k];
    		}
    		j=i,val[i]=k=i-1;
    		while(j<n)
    		{
    			if(k==i-1||(str[j]==str[k]&&2*(k-i+1)<(j-i+1)))	val[++j]=++k;
    			else	k=next[k];
    		}
    		for(j=i+2*m;j<=n;j++)	ans+=(val[j]-i>=m);
    	}
    	printf("%d",ans);
    	return 0;
    }
  • 相关阅读:
    常见错误
    mac安装cocoapods
    WPS复制时删除超链接
    Network | 协议栈
    Leetcode | Remove Duplicates from Sorted Array I && II
    Leetcode | Search in Rotated Sorted Array I & II
    Leetcode | Jump Game I && II
    Leetcode | Combination Sum I && II
    Leetcode | Construct Binary Tree from Inorder and (Preorder or Postorder) Traversal
    Leetcode | Trapping Rain Water
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7587298.html
Copyright © 2011-2022 走看看