http://codeforces.com/problemset/problem/432/D

转自:https://blog.csdn.net/tc_to_top/article/details/38793973

题意

给出一个字符串,求有多少种长度的前缀和后缀相等,并且这种形式的子串在原字符串中出现的次数。

分析

首先得到主串的next数组,next数组的含义是next[j]的值表示str[0...j-1](我的next[0]是-1)这个子串的前后缀匹配的最长长度,如样例1
index  0  1  2  3  4  5  6  7
str    A  B  A  C  A  B  A
next   -1 0  0  1  0  1  2  3
next[6] = 2即ABACAB这个子串的前后缀最长匹配是2(AB),此时表明存在前缀与后缀匹配长度为2的串。
由此性质我们可以发现满足条件的子串即是next[next[len。。。]]不断往前递归直到为0,因为长的可能会包含短的,我们可以递归得到re数组(re记录的就是子串出现的次数)re数组的递归式为re[next[i]] += re[i];
#include <cstdio>
#include <cstring>
int const MAX = 1e5 + ;
char s[MAX];
int next[MAX];
int len, pos, num;
int l[MAX], cnt[MAX], re[MAX]; void get_next(){
int i = , j = -;
next[] = -;
while(s[i] != '\0') {
if(j == - || s[i] == s[j]){
i ++;
j ++;
next[i] = j;
}else
j = next[j];
}
} void solve(){
for(int i = ; i <= len; i++)
re[i] = ;
for(int i = len; i >= ; i --)
if(next[i] != -)
re[next[i]] += re[i];
int pos = len;
while(pos){
cnt[num] = re[pos];//次数
l[num ++] = pos;//长度
pos = next[pos];
}
} int main(){
scanf("%s", s);
len = strlen(s);
get_next();
solve();
printf("%d\n", num);
for(int i = num - ; i >= ; i--)
printf("%d %d\n", l[i], cnt[i]);
}

最新文章

  1. eclipse按照svn插件
  2. android largeheap 的设定
  3. org.eclipse.swt.custom.StyledText.getScrollbarsMode()I
  4. Android - 控件android:ems属性
  5. mysql事务,SET AUTOCOMMIT,START TRANSACTION
  6. Java 动态编译组件 &amp; 类动态加载
  7. C#操作.csv文件Demo
  8. 为Android游戏接入第三方登录功能
  9. USB Type-C 应用面临安全性考验,USB-IF 将推动新认证机制
  10. 使用反射让Spinner选择同一选项时触发onItemSelected事件
  11. 【转】Python3.x移除了callable内建函数
  12. 浅谈web前端开发阅历
  13. C# 关于委托的小例子
  14. 用c++写一个 “hello,world” 的 FastCGI程序
  15. C#设计模式之二简单工厂模式(过渡模式)
  16. Spring Cloud Eureka服务Demo级搭建
  17. [Alpha阶段]第六次Scrum Meeting
  18. ionic1滑动时间选择器
  19. 158A
  20. openwrt lan/wan口自动翻转

热门文章

  1. Java使用HTTPClient3.0.1开发的公众平台消息模板的推送功能
  2. 配置wbepack
  3. [CNBETA]Intel CPU底层漏洞事件完全详解:全球手机/电脑无一幸免[转帖]
  4. webpack4.x相关笔记整理
  5. Java微信二次开发(四)
  6. 理解C语言递归up_and_down
  7. Mysterious Bacteria LightOJ - 1220
  8. c# Point不能输入小数
  9. python的多线程到底有没有用?
  10. 自定义git忽略规则