题目的匹配应该也要看成一个文本串与另一个模式串的匹配过程

Text是以当前i结尾的后缀来匹配Pattern的前缀(非真)

这里的Pattern肯定是可以匹配成功的,直接由next来保证(next总是当前结尾的最大前缀,恰好满足递推的需要)

(说的不是很准确,就是kmp匹配过程时使用的方法)

举个栗子:

a b a b a c b a

0 0 1 2 3 0 0 1 next

1 1 1 1 1 1 1 1 dp 初始合法状态

1 1 2 2 3 1 1 2 dp 最终计算结果

dp[1] = 1+dp[next[1]] :
Text a
Pattern a
dp[2] = 1+dp[next[2]]:
Text ab
Pattern ab
dp[3] = 1+dp[next[3]] = 1+dp[1]:
Text aba
Pattern aba a
dp[4] = 1+dp[2]:
Text abab
Pattern abab ab
dp[5] = 1+dp[3]:
Text ababa
Pattern ababa aba a
....
dp[8] = 1+dp[1]:
Text ababacba
Pattern ababacba a

最终统计得到

4 a

2 ab

2 aba

1 abab

1 ababa

1 ababac

1 ababacb

1 ababacba

这种以【当前状态】来转换角度的统计方法值得学习

所以说动态规划天下第一(明明是递推

/*H E A D*/
int nxt[maxn];
char P[maxn];
int dp[maxn];//dp[i]:P[i]结尾的子串所含满足匹配的前缀的个数
void buildNext(){
nxt[1]=0;
int j=0;
int m=strlen(P+1);
rep(i,2,m){
while(j>0&&P[i]!=P[j+1]) j=nxt[j];
if(P[i]==P[j+1]) j++;
nxt[i]=j;
dp[i]=1+dp[j];
}
}
int main(){
int t=read();
while(t--){
int n=read();
s1(P);
dp[0]=0;
rep(i,1,n) dp[i]=1;
buildNext();
ll sum=0;
rep(i,1,n) sum=(sum+dp[i])%10007;
println(sum);
}
return 0;
}

最新文章

  1. SQL Server数据库SP命令祥解
  2. JAVA中的线程安全与非线程安全
  3. spring " expected single matching bean but found 2" 问题一例。
  4. 转: Rest简介及Spring实现
  5. js中offsetLeft,offsetTop,offsetParent计算边距方法
  6. 【原】storm源码之storm代码结构【译】
  7. misc设备
  8. python用httplib模块发送get和post请求
  9. 修改数据库中group_concat的返回结果的长度限制
  10. android 自定义 radiobutton 文字颜色随选中状态而改变
  11. ADO.Net的小知识(连接数据库)二
  12. mysql导出部分(指定)数据库表字段
  13. [Angular 2] Using Array ...spread to enforce Pipe immutability
  14. STM32F2系列系统时钟默认配置
  15. 2017-2-19 C#基础 数据类型
  16. GridView应用随笔
  17. Android -- 仿小红书欢迎界面
  18. ecshop获取商品销量函数
  19. assert断言
  20. <c:out>标签中的escapeXML属性

热门文章

  1. sencha表单入门例子
  2. grid search 超参数寻优
  3. wordpress+lnmp出现 404 Not Found nginx
  4. Cookie的有效访问路径
  5. javascript总结8:JavaScript 类型转换
  6. delphi7和XE下 获取路径
  7. Jquery queue实例
  8. sqlServer组合主键
  9. 《C#多线程编程实战》2.5 AutoResetEvent
  10. 原码、反码、补码及位操作符,C语言位操作