Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes

时间:2022-09-05 13:03:48
                                                    D. Prefixes and Suffixes

You have a string s = s1s2...s|s|, where |s| is the length of string s, and si its i-th character.

Let's introduce several definitions:

  • A substring s[i..j] (1 ≤ i ≤ j ≤ |s|) of string s is string sisi + 1...sj.
  • The prefix of string s of length l (1 ≤ l ≤ |s|) is string s[1..l].
  • The suffix of string s of length l (1 ≤ l ≤ |s|) is string s[|s| - l + 1..|s|].

Your task is, for any prefix of string s which matches a suffix of string s, print the number of times it occurs in string s as a substring.

Input

The single line contains a sequence of characters s1s2...s|s| (1 ≤ |s| ≤ 105) — string s. The string only consists of uppercase English letters.

Output

In the first line, print integer k (0 ≤ k ≤ |s|) — the number of prefixes that match a suffix of string s. Next print k lines, in each line print two integers lici. Numbers lici mean that the prefix of the length li matches the suffix of length li and occurs in string s as a substring ci times. Print pairs lici in the order of increasing li.

Sample test(s)
Input
ABACABA
Output
3
1 4
3 2
7 1
Input
AAA
Output
3
1 3
2 2
3 1

提意:求出满足前缀等于后缀的所有的子串的个数

sl:开始我是用的hash扫了下满足条件的前缀 然后 构造了一个ac自动机 超时 太大意了,搞得C题没敲完都。

原来此题 是KMP的应用,其实就是两道原题的组合,关键是如何分类求出所有前缀的个数,首先用一个vis标记满足

条件的前缀,然后用next数组扫一边所有前缀此次扫描都是扫的以当前字符为结尾的最大的前缀,所以最后还要扫描一次

又叫我长见识了。。。。。 >_<

 1 //codeforces Codeforces Round #246 (Div. 2) D
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <vector>
 7 #include <list>
 8 #include <queue>
 9 using namespace std;
 const int MAX = 1e6+;
 const int inf = 0x3f3f3f3f;
 vector<pair<int,int> > ans;
 int dp[MAX],next[MAX],vis[MAX],cnt[MAX];
 char str[MAX];
 int main()
 {
     //freopen("in","r",stdin);
     //freopen("out","w",stdout);
     while(scanf("%s",str+)==) {
         int n=strlen(str+);
         next[]=; int j=;
         for(int i=;i<=n;i++) {
             while(str[i]!=str[j+]&&j) j=next[j];
             if(str[i]==str[j+]) j++;
             next[i]=j;
         }
 
         int x=n;
         while(x) {
             vis[x]=; x=next[x];
         }
         for(int i=n;i>=;i--) cnt[next[i]]++;
        // for(int i=1;i<=n;i++) printf("%d ",cnt[i]); printf("\n");
         for(int i=n;i>=;i--) cnt[next[i]]+=cnt[i];
         for(int i=;i<=n;i++) if(vis[i]) ans.push_back(make_pair(i,cnt[i]));
 
         printf("%d\n",(int)ans.size());
 
         for(int i=;i<ans.size();i++) printf("%d %d\n",ans[i].first,ans[i].second+);
     }
     return ;
 }

Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes的更多相关文章

  1. Codeforces Round &num;246 &lpar;Div&period; 2&rpar; D&period; Prefixes and Suffixes&lpar;后缀数组orKMP&rpar;

    D. Prefixes and Suffixes time limit per test 1 second memory limit per test 256 megabytes input stan ...

  2. Codeforces Round &num;527 &lpar;Div&period; 3&rpar; C&period; Prefixes and Suffixes

    题目链接 题意:给你一个长度n,还有2*n-2个字符串,长度相同的字符串一个数前缀一个是后缀,让你把每个串标一下是前缀还是后缀,输出任意解即可. 思路;因为不知道前缀还是后缀所以只能搜,但可以肯定的是 ...

  3. Codeforces Round &num;527 &lpar;Div&period; 3&rpar; C&period; Prefixes and Suffixes &lpar;思维&comma;字符串&rpar;

    题意:给你某个字符串的\(n-1\)个前缀和\(n-1\)个后缀,保证每个所给的前缀后缀长度从\([1,n-1]\)都有,问你所给的子串是前缀还是后缀. 题解:这题最关键的是那两个长度为\(n-1\) ...

  4. Codeforces Round &num;246 &lpar;Div&period; 2&rpar;

    题目链接:Codeforces Round #246 (Div. 2) A:直接找满足的人数,然后整除3就是答案 B:开一个vis数组记录每一个衣服的主场和客场出现次数.然后输出的时候主场数量加上反复 ...

  5. Codeforces Round &num;587 &lpar;Div&period; 3&rpar; A&period; Prefixes

    链接: https://codeforces.com/contest/1216/problem/A 题意: Nikolay got a string s of even length n, which ...

  6. Codeforces Round &num;246 &lpar;Div&period; 2&rpar; C&period; Prime Swaps(贪心,数论)

    题目链接:http://codeforces.com/contest/432/problem/C 首先由题意分析出:这些数是从1到n且各不相同,所以最后结果肯定是第i位的数就是i. 采用这样一种贪心策 ...

  7. Codeforces Round &num;246 &lpar;Div&period; 2&rpar; B&period; Football Kit

    题目的意思是求出每个队穿主场衣服和客场衣服的次数 每个队作为主场的次数是n-1,作为客场的次数是n-1 当每个队打主场的时候肯定穿的主场衣服 当每个队打客场时,如果客场与主场的衣服不同,则穿客场衣服 ...

  8. Codeforces Round &num;246 &lpar;Div&period; 2&rpar; A&period; Choosing Teams

    给定n k以及n个人已参加的比赛数,让你判断最少还能参加k次比赛的队伍数,每对3人,每个人最多参加5次比赛 #include <iostream> using namespace std; ...

  9. Codeforces Round &num;246 &lpar;Div&period; 2&rpar;——D题

    KMP算法,没写出来,完全不理解NEXT数组.现在理解了很多 答案都在程序中 ,不过这个思想真的很神奇, 还有毛语不好,一直没看懂题目,现在懂了, 大概是:S中前缀等于后缀,求其长度,和其在S中出现了 ...

随机推荐

  1. 本地搭建Dubbo监控中心的安装步骤

    Dubbo监控中心的安装步骤 参考链接:http://blog.csdn.net/lichunan/article/details/40349645 一.从github上下载dubbo源码进行编译: ...

  2. Css小技巧-图片垂直居中

    说明:样式设置主要是针对图片的父级元素,并非图片元素本身. Css代码[图片父级点的样式]: <style> .box { /*非IE的主流浏览器识别的垂直居中的方法*/ display: ...

  3. 结对编程1——四则运算-GUI

    码市链接:https://coding.net/u/hmhhh/p/hmh-homework/git/tree/master/ 201421123003 黄建英 201421123004 黄美海 题目 ...

  4. PHP设计模式三:原型设计模式

    一.什么是原型设计模式 原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的.原型设计模式的目的是通过使用克隆以减少 实例化对象的开销. 在原型设计模式中,Client类是不 ...

  5. FFPLAY的原理(六)

    显示视频 这就是我们的视频线程.现在我们看过了几乎所有的线程除了一个--记得我们调用schedule_refresh()函数吗?让我们看一下实际中是如何做的: static void schedule ...

  6. 【安富莱二代示波器教程】第19章 附件E---参考资料

    第19章      附件E---参考资料 DSP教程 http://forum.armfly.com/forum.php?mod=viewthread&tid=3886 . FreeRTOS教 ...

  7. 进入root提示Authentication failure错误

    新安装Ubuntu 18.4,想进入root角色,提示“Authentication failure” 失败. 因为是新安装,并无root的密码,所以需要新增加: sudo passwd root,之 ...

  8. face detection&lbrack;Face R-CNN&rsqb;

    face r-cnn是腾讯ai实验室的作品,而且登录过腾讯ai实验室官网,发现果然硕果累累,不得不佩服. 1 引言 人脸检测虽然相对之前有了不小的进步,可是还是因为真实世界中人脸图像的明显变化导致仍然 ...

  9. 共享单车微信小程序

    微信小程序bike单车,前台使用小程序地图控件+weui+小程序相关组件和API,后台使用SpringBoot+JPA,用户及单车信息保存进mongodb,短信平台的配置信息和临时生成的验证码存放进r ...

  10. HTML5新协议介绍 WebSocket

    WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站为了实现即时通讯(real-time) ...