题意

给定一个字符串S,定义子串subS[i] = S[0..i],定义C[i]为S中subS[i]的数量,求sigma(C[i])(0<=i<N)。

思路

我们以子串结尾的位置来划分阶段求解,即,设ans[i]表示以第i个字符为结尾的子串的个数,则res = sigma(ans[i])。

那么我们怎么求出以某个位置为结尾的字符串中有多少是subS[i]呢?

考虑subS[i]就是S的N个前缀,而以某个位置为结尾又是后缀,所以我们自然要想到利用next数组---前缀后缀对称来解决这个问题。

由next[i]=j表示S[1...j] = S[i-j+1...i]可知,以i为结尾的子串中包含subS[j]本身,并且,它一定还包含subS[j]所包含的前缀。所以ans[i] = ans[j]+1。

最后再加上以i为结尾的子串它本身(上面计算时并没有包括它本身)。

代码

[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#define MID(x,y) ((x+y)/2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define REP(i, begin, end) for (int i = begin; i <= end; i ++)
using namespace std;
char s[100005];
long long next[100005], res[100005], ans;
long long cal_res(int j){
if (next[j] == -1)
return 0;
else if (~res[j]){
return res[j];
}
else{
res[j] = cal_res(next[j]) + 1;
return res[j];
}
}
void get_next(){
int len = strlen(s), j = -1;
ans = len; next[0] = -1;
for (int i = 1; i < len; i ++){
while(j > -1 && s[i] != s[j+1]) j = next[j];
if (s[i] == s[j+1]) j ++;
next[i] = j;
ans += cal_res(i);
}
}
int main(){
int t;
scanf("%d", &t);
while(t --){
MEM(s, 0); MEM(res, -1);
scanf("%s", s);
get_next();
printf("%lld\n", ans);
}
return 0;
}
[/cpp]

HUST 1328 String (字符串前缀子串个数 --- KMP)的更多相关文章

  1. SPOJ - SUBST1 New Distinct Substrings —— 后缀数组 单个字符串的子串个数

    题目链接:https://vjudge.net/problem/SPOJ-SUBST1 SUBST1 - New Distinct Substrings #suffix-array-8 Given a ...

  2. HUST 1328 String

    11: KMP next 的强大 题意求前缀在S中出现的次数之和 next[j] 表示 S[0....NEXT[J]]==S[J-NEXT[J].....J]; 于是我们得到..后加入一个字符所得到新 ...

  3. C++ 字符串中子串个数

    子串可重叠情况: int fun1(const std::string& str, const std::string& sub){ int num = 0; for (size_t ...

  4. C++自定义String字符串类,支持子串搜索

    C++自定义String字符串类 实现了各种基本操作,包括重载+号实现String的拼接 findSubStr函数,也就是寻找目标串在String中的位置,用到了KMP字符串搜索算法. #includ ...

  5. HDU 4622 Reincarnation (查询一段字符串的不同子串个数,后缀自动机)

    Reincarnation Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  6. HDU4622 (查询一段字符串的不同子串个数,后缀自动机)

    http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给出一个字符串和q次询问,每次询问[l,r]区间内不同子串的个数 分析: N<=2000. 我 ...

  7. HDU 3336 输出包括从1到len长 字符串前缀的总个数(+DP)

    Sample Input14abab Sample Output6输出包括从1到len长 字符串前缀的总个数abab:包括2个a,2个ab,1个aba,1个abab # include <cst ...

  8. 给出一个string字符串,统计里面出现的字符个数

    给出一个string字符串,统计里面出现的字符个数 解决方案: 使用algorithm里面的count函数,使用方法是count(begin,end,'c'),其中begin指的是起始地址,end指的 ...

  9. iOS - Swift String 字符串

    前言 public struct String public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCodin ...

随机推荐

  1. 工作笔记——限定input上传文件对话框中能选取的文件的格式

    原文:http://www.dengzhr.com/frontend/1059 input[file]标签的accept属性可用于指定上传文件的 MIME类型 . 例如,想要实现默认上传图片文件的代码 ...

  2. smart基础原理

    1html模板页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  3. java反射之构造方法(三)

    一. 1. 二.获取类的构造方法信息. ######################################################################## 三.

  4. $digest / $apply digest in progress报错

    有的时候出于某种原因,如jq操作了model.或者$watch.setTimeout等函数改变了model,导致最后没有脏数据检测.所以我没就手动调用了$apply( )等.但是第一次运行的时候ang ...

  5. hdu6194 string string string

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6194 题目: string string string Time Limit: 2000/10 ...

  6. iOS开发之NSUserDefaults

    在ios中偏好设置保存用户配置的对象 //NSUserDefaults读取 //获取标准函数对象 //通过对象获取名称下NSMutableDictionary数据 NSUserDefaults *de ...

  7. SQL执行并返回执行前/后结果

    SQLServer: 1.插入数据,并返回插入的数据: INSERT INTO TestTB(Province,City) output inserted.Province, inserted.Cit ...

  8. Spring Tomcat启动过程

    入口,配置再web.xml中, 初始化applicationContext 创建webApplicationContext,这里可加载web.xml文件中定义了contextClass 获取conte ...

  9. 20145321 《Java程序设计》课程总结

    20145321 <Java程序设计>课程总结 读书笔记链接汇总 第一周读书笔记 第二周读书笔记 第三周读书笔记 第四周读书笔记 第五周读书笔记 第六周读书笔记 第七周读书笔记 第八周读书 ...

  10. Java 面试题代码类收集

    long temp=(int)3.9; System.out.println(temp); temp%=2; System.out.println(temp); 3 1 Java里面类的方法名可以与类 ...