首页 > 其他分享 >动物园

动物园

时间:2023-09-08 22:23:29浏览次数:34  
标签:nxt slen 1000100 int 后缀 num 动物园

Smiling & Weeping

                ---- 你是我的,半截的诗,不许别人更改一个字

 

题目链接:P2375 [NOI2014] 动物园 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路详解:这道题目是要求解:有多少个我现在希望求出一个更强大 num 数组一一对于字符串 S 的前 i 个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i]。

  其实,我刚开始是想求解公共最长前后缀再加上跳跃优化~o(╥﹏╥)o这是个错误的思路

 然后,又用s和s的每个后缀的LCP 结合 公共最长前后缀 再加上跳跃优化o(╥﹏╥)o 很可惜TLE

  最后,一想,为什么不能把思路化简一下呢,只求每个(s[0] == s[i])的LCP,仔细想想是不是这样,在这个区间的每个字母都会有这样一个以s[i]为开头的前缀,然后len=min(i , nxt[i])(不能重叠,并且有公共部分),将i~i+len-1部分的num[i]++,思路很清晰,代码也很好实现,(⊙︿⊙) + o(╥﹏╥)o 很可惜TLE ,最后使用 前缀和 和 差分 来小小的优化一波,AC

Talk is cheap , show me the code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mode = 1000000007;
 5 int n , Next[1000100] , slen;
 6 int nxt[1000100] , num[1000100];
 7 ll ans;
 8 char str[1000100];
 9 void getnext(char *s , int slen){
10     int p=0 , k=1,l;
11     nxt[0] = slen;
12     while(p+1 < slen && s[p]==s[p+1]) p++;
13     nxt[1] = p;
14     for(int i = 2; i < slen; i++){
15         p = k+nxt[k]-1;
16         l = nxt[i-k];
17         if(i+l <= p) nxt[i] = l;
18         else {
19             int j = max(0 , p-i+1);
20             while(i+j < slen && s[i+j] == s[j]) j++;
21             nxt[i] = j;
22             k = i;
23         }
24     }
25 }
26 void solve(){
27     for(int i = 1; i < slen; i++){
28         if(str[i] == str[0]){
29             int len = min(i , nxt[i]);
30             // 会被卡,TLE,改用前缀和,可以通过
31             // for(int j = i; j <= i+len-1; j++)
32             //     num[i]++;
33             num[i]++; num[i+len]--;
34         }
35     }
36     for(int i = 1; i < slen; i++)
37         num[i] += num[i-1];
38 }
39 int main()
40 {
41     scanf("%d",&n);
42     while(n--){
43         ans = 1;
44         scanf("%s",str);
45         slen = strlen(str);
46         getnext(str , slen);
47         solve();
48         for(int i = 1; i < slen; i++)
49             ans = ans*(num[i]+1)%mode , num[i] = 0;
50         printf("%lld",ans);
51         if(n) printf("\n");
52     }
53     return 0;
54 }

不要因为也许会改变,就不肯说那句美丽的誓言;

不要因为也许会分离,就不敢求一次倾心的相遇;

文章到此结束,我们下次再见 跳舞(((((ી(・◡・)ʃ)))))

标签:nxt,slen,1000100,int,后缀,num,动物园
From: https://www.cnblogs.com/smiling-weeping-zhr/p/17688651.html

相关文章

  • 大熊猫直播还没有看?TSINGEE轻松打造动物园直播方案,在线看,时时看~
    最近旅居韩国的大熊猫爱宝喜添双胞胎,新闻迅速登上了热搜。不仅爱宝、乐宝、福宝,国内萌萌的花花、阳光开朗大男孩西直门三太子萌兰等也长期霸占各大平台的热搜词条。在成都大熊猫繁育研究基地,络绎不绝的游客们为了一睹“顶流女明星”花花的芳容,不惜排队半天。根据公开资料显示,顶流......
  • 【题解】 [APIO2007] 动物园
    目录题目链接原题描述题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2提示题意概括思路历程1.与环相关2.设计状态代码实现题目链接原题描述[APIO2007]动物园题目描述新建的圆形动物园是亚太地区的骄傲。圆形动物园坐落于太平洋的一个......
  • Luogu P2375 [NOI2014] 动物园
    [NOI2014]动物园题目描述近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。某天,园长给动物们讲解KMP算法。园长:“对于一个字符串\(S\),它......
  • [NOI2014]动物园
    [NOI2014]动物园这题看题目描述就知道一定是跟KMP扯上关系了。首先,如果不考虑长度超过\(\dfrac{1}{2}\)的限制的话,那么就很简单,每次求出一个新的\(ne_i\)时,如下图所示图中红色的表示目前对于前\(i\)个字符来说,最长公共前后缀为红色部分,因为两个红色部分中一定都有前后......
  • 动物园
    动物园这道题的背景有些牵强,其实\(q_i\)完全没有用。首先,如果《饲养指南》中提到的规则在动物园已有的动物中存在,那么这种饲料一定会购买,那么就可以养\(p_i\)位为\(0/1\)都可以。但是如果动物园已有的动物中不存在,那么如果新动物\(p_i=1\)必定是要买新的饲料,那么不符合......
  • 软件开发方法动物园
    这里总结了1970年以来的软件开发方法,这些开发方法的某些特质与动物园的某些动物类似哦!,这些开发方法的某些特质与动物园的某些动物类似哦!Waterfall–1970瀑布模型是一种连续的软件开发过程……,它使得开发从需求分析、设计、实施(验证)、集成、整合和维护阶段逐步发......
  • 动物园
    动物园/*cnt代表匹配到的位置在这里的时候,已经包含匹配好的数量直接将第一个的值赋值为1就可以了这里是采取匹配两次的方法,第一次求ne数组并初始化cnt第二次是确保匹配的长度不会过大,也就是只有前面i/2个元素进行匹配,时间复杂度是o(n)两次匹配,从而确保范围*/#include<b......
  • P2375 [NOI2014] 动物园
    求num[i],表示1~i前缀的合法子串个数(满足前后缀相等,且不重合 #include<iostream>#include<cstring>usingnamespacestd;constintN=1e6+3,mod=1e9+7;......
  • 洛谷P2375 [NOI2014] 动物园【题解】
    题目简要对于字符串\(......
  • 《基于 Unity3D 的虚拟现实游戏设计与实现 ——以<VR 动物园>项目为例》读后随笔
    随着虚拟现实技术和游戏行业的融合发展,具有更强沉浸感、交互性和娱乐性的VR游戏也获得了充足的发展空间,但是作为高技能人才培养的高职院校却与VR行业新技术的发展渐行......