题目大意:
就是现在给出一个长度不超过20W的字符串S, 对于这个字符串求其所有前缀在串中出现次数的和, 结果对10007取模
大致思路:
很容易想到后缀数组, 找到sa[i] = 0的那个就是串S, 那么找出这个位置向两边能扩展到的长度即可, 就是利用一下height数组就行了, 没什么难度= =
还是不清楚的话看代码细节吧
另外也可以用KMP + DP来做
首先next[i]表示在第i个字符处适配了应该匹配第几个字符, 那么用dp[i]表示以第i个字符作为结尾的匹配的前缀的个数, 就可以有
dp[i] = dp[next[i]] + 1, 所有的dp的和就是最终的结果了
代码如下:
后缀数组的做法:
Result : Accepted Memory : 9608 KB Time : 452 ms
/*
* Author: Gatevin
* Created Time: 2015/5/4 16:03:18
* File Name: Rin_Tohsaka.cpp
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
KMP + DP的做法:
Result : Accepted Memory : 3332 KB Time : 46 ms
/*
* Author: Gatevin
* Created Time: 2015/5/4 18:31:56
* File Name: Rin_Tohsaka.cpp
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include