题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3336/

题意就是要求一个字符串的所有前缀在字符串中出现的次数之和,我们容易想到kmp中的next数组,next[i]=j,表示存在一个长度为j的前缀与长度为j的后缀相同,本题的结果就是要对每一位的next数组都向前回退,回退的次数就是长度不同的前缀出现的次数。还可以采用dp的策略。

代码如下:

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
#define maxn 1000010
int n,m,t;
int nxt[maxn];
char s[maxn];
void getnxt()
{
int i=-,j=;
nxt[]=-;
while(j<n)
{
if(i==-||s[i]==s[j])
{
i++,j++;
nxt[j]=i;//不能用kmp优化的nxt,那样会损失数量
}
else i=nxt[i];
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
scan(t);
while(t--)
{
scan(n);
scanf("%s",s);
getnxt();
int ans=;
f(i,,n)//查看以i-1为截至位置的公共前缀后缀
{
int j=i;
while(j>)
{
ans++;//初始时本身还要算一次
if(ans>)ans-=;
j=nxt[j];
}
}
pf("%d\n",ans);
}
}

dp:

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int const MOD = ;
int const MAXN = ;
char s[MAXN];
int next[MAXN],dp[MAXN];
inline void Get_Next(int n){
memset(next,,sizeof(next));
for(int i = ;i < n;i++){
int j = next[i];
while(j && s[i] != s[j]) j = next[j];
if(s[i] == s[j]) next[i + ] = j + ;
else next[i + ] = ;
}
}
int main(){
int T;
while(~scanf("%d",&T)){
while(T--){
int n;
scanf("%d",&n);
scanf("%s",s);
Get_Next(n);
for(int i = ;i < n;i++){
dp[i] = ;
}
dp[] = ;
int sum = ;
for(int i = ;i <= n;i++){
dp[i] = dp[next[i]] + ;
sum = (sum + dp[i]) % MOD;
}
printf("%d\n",sum);
}
}
return ;
}

最新文章

  1. 【转】valueof()用法
  2. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(01)
  3. Nutch源码阅读进程5---updatedb
  4. Navicat 的使用(一)
  5. opencv3.1 + opencv_contrib编译记事(win7下)
  6. 给ubuntu开通FTP功能
  7. sphinx搜索引擎架构图
  8. magic矩阵 分类: 数学 2015-07-31 22:56 2人阅读 评论(0) 收藏
  9. Orchard官方文档
  10. java线程中的wait和notify以及notifyall
  11. Solr多核的配置
  12. Android 官方文档:(二)应用清单 —— 2.26 &amp;lt;uses-permission&amp;gt;标签
  13. unity简易小地图的实现(NGUI)
  14. OSG和osgearth显示中文(转载)
  15. 【Flask】微型web框架flask大概介绍
  16. 一行命令更新所有 npm 依赖包
  17. MGR架构~高可用架构细节的梳理
  18. LeetCode(117):填充同一层的兄弟节点 II
  19. JSP基本_JSTL
  20. Android改进版CoverFlow效果控件

热门文章

  1. Spring5源码分析(1)设计思想与结构
  2. Python-控制语句及函数
  3. STM32 一个初始化EXTI的例子
  4. MySQL show命令的用法
  5. 【问】:和=在map里面的区别
  6. 第六周学习笔记,vc各类控件的输入输出
  7. Java并发编程(01):线程的创建方式,状态周期管理
  8. jdbc对 数据库的数据进行增删改(两个类)
  9. 造轮子系列(三): 一个简单快速的html虚拟语法树(AST)解析器
  10. 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽