题目链接:http://codeforces.com/problemset/problem/432/D

题意:

  给你一个字符串s,让你找出所有既是前缀又是后缀的子串,并输出它们分别出现了多少次。

题解:

  先对原串求一次nex数组。

  然后枚举位置i:

    sub(k)表示前缀s[0 to k]

    dp[i]表示sub(i)在原串s中的出现次数

    假设nex[i] = a, nex[a] = b, nex[b] = c ... nex[z] = -1

    则sub(a), sub(b), sub(c)...sub(z)均以s[i]结尾,dp[a...z]均+1。

  然而一个一个加会T...

  

  所以:

    初始时所有的 dp = 1

    每次:if(nex[i] != -1) dp[nex[i]] += dp[i]

    一路传递下去就好。

  

  最后从nex[len-1]开始往前跳nex。

  对于每次跳到的nex,sub(nex)一定也是s的后缀。

  此时输出它的出现次数dp[nex]。

  另外因为要顺着输出,而nex是倒着跳的,所以先存到stack里再输出。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#define MAX_N 100005 using namespace std; int n;
int dp[MAX_N];
int nex[MAX_N];
char s[MAX_N]; void cal_nex(char *p,int len)
{
nex[]=-;
int k=-;
for(int i=;i<len;i++)
{
while(k>- && p[i]!=p[k+]) k=nex[k];
if(p[i]==p[k+]) k++;
nex[i]=k;
}
} int main()
{
scanf("%s",s);
n=strlen(s);
cal_nex(s,n);
for(int i=;i<n;i++) dp[i]=;
for(int i=n-;i>=;i--)
{
if(nex[i]!=-) dp[nex[i]]+=dp[i];
}
stack<int> stk;
int p=n-;
while(p!=-)
{
stk.push(p);
p=nex[p];
}
cout<<stk.size()<<endl;
while(!stk.empty())
{
int now=stk.top();
stk.pop();
cout<<now+<<" "<<dp[now]<<endl;
}
}

最新文章

  1. LINUX中如何查看某个进程打开的网络链接有多少
  2. lecture6-mini批量梯度训练及三个加速的方法
  3. 【Visual Lisp】表处理专题
  4. 资源监控工具Spotlight-使用说明
  5. SharePoint 2010 文档管理之过期归档工具
  6. Oracle对索引列同时使用多个聚合函数的性能问题
  7. HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容
  8. java基础---java语言概述
  9. c运行时函数参考学习地址
  10. sublime text 3 左侧目录树中文文件夹显示方框问题解决
  11. vue 的动画
  12. 关于esp32的省电模式的WiFi连接
  13. iOS 新浪微博-3.0 新特性
  14. oracle常用SQL——创建用户、表空间、授权(12C)
  15. vue项目post请求405报错解决办法。
  16. vue学习记录
  17. 使用apache服务器配置虚拟目录
  18. [转] LVM分区在线扩容
  19. HTML页面格式
  20. Tess4J -4.0.2- Linux 实践 [解决:Tess4J - Native library (linux-x86-64/libtesseract.so) not found in resource path]

热门文章

  1. Webpack与Gulp、Grunt区别
  2. 千万级的大表!MySQL这样优化更好
  3. LCD屏背光驱动调试心得---血的教训
  4. 题外话:计算密集型 vs IO密集型
  5. golang struct 定义中json``解析说明
  6. 06 nginx Location详解之精准匹配
  7. textarea中的内容的获取
  8. kubernetes高级之集群中使用sysctls
  9. css3中font-face属性的用法详解
  10. Spring 和 filter