/*
巧妙地使用fail数组
根据fail数组的定义
fail[i] 有 长度为i的子串最长公共前后缀为fail[i]
比如样例 fail 0 0 1 2
那么我们维护一个ans[i]表示到i位置的时候
前i位置子串的匹配次数
比如 a b a
ans[1]=1 ans[2]=1
到ans[3]的时候 发现 a 又出现了一边 说明之前的a子串统计少了
相应的可以根据 fail找到a的位置在统计一遍就不漏了
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200010
using namespace std;
int T,an,ans[maxn],l,fail[maxn];
char s[maxn];
void kmp_init()
{
int p=;
for(int i=;i<=l;i++)
{
while(p&&s[p+]!=s[i])
p=fail[p];
if(s[p+]==s[i])
p++;
fail[i]=p;
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&l);
scanf("%s",s+);
an=;//初始化害死人
memset(ans,,sizeof(ans));
memset(fail,,sizeof(fail));
kmp_init();
for(int i=;i<=l;i++)
{
ans[i]=;
if(fail[i])//如果当前的子串存在公共前后缀
//说明这个公共缀之前统计少了
ans[i]+=ans[fail[i]];
an=(an+ans[i])%;
}
printf("%d\n",an);
}
}

HUD3336的更多相关文章

随机推荐

  1. google zxing 二维码扫描(android client分析)

    一.总体架构 二.架构分析 1. com.google.zxing.client.android AmbientLightManager 环境光线管理 Detects ambient light an ...

  2. 转:简单介绍 P3P 技术

    原文来自于:http://blog.csdn.net/ghj1976/article/details/4889219 以 Internet Explorer 为例,默认情况下,IE的隐私策略如下图所设 ...

  3. C参数计算

    C‘计算参数时,从右向左压栈的 int a[]={1,3,4}; int * ptr=a; pirntf("%d,%d\n",*ptr,*(++ptr)); 输出都是3:

  4. 【Linux】鸟哥的Linux私房菜基础学习篇整理(十)

    1. at [-mldv] TIME/at -c 工作号码:单一工作调度.参数:-m:当at的工作完成后,即使没有输出信息,以email通知用户该工作已完成:-l:相当于atq,列出目前系统上面的所有 ...

  5. JFS 文件系统概述及布局分析

    JFS 文件系统概述及布局分析 日志文件系统如何缩短系统重启时间 如果发生系统崩溃,JFS 提供了快速文件系统重启.通过使用数据库日志技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态,而非日 ...

  6. a trick in reading and storing file in the exact way!

    read and write file is a very common operation regarding file mainuplation. However, the powerfull g ...

  7. bzoj3531

    不难想到树链剖分这题的难点是记录的是路径上宗教相同的点裸的想法是对每一种宗教都开一棵线段树,记录每个点的评级但显然这样会爆空间,仔细分析一下,这些线段树内很多点压根就没用到因此我们考虑对线段树动态开点 ...

  8. soap协议

    定义: 简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息. 协议中的几个关键词术语: SO ...

  9. poj1013

    题目大意:假造的银币 Sally Jones有一些游客给的银币,但是只有11枚是真正的银币(有一枚是假的),从颜色和大小是无法区分真比还是假币的,但是它的重量和真币是不同的,Sally Jones它是 ...

  10. ActionScript 3.0日期与时间管理(Date类)

    ,6)); var now_1:Date=new Date(); trace(now_1.getHours());    /*输出结果会根据设置和测试时间不同而有                    ...