HDU - 3336 Count the string(扩展kmp)

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=3336

题意

给你一个字符串,求它的每一个前缀出现的次数。

思路

先扩展kmp得到next数组,该字符串的每一个后缀的next值的和就是答案。
因为对于一个后缀,它的next值表示的是它和该字符串的前缀的最大匹配长度,比如说如果next[i]为3,后缀为abcd,这个时候字符串的a,ab,abc前缀都出现了一次,所以ans+=3。

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using std::pair;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pairint> PPI;
typedef pairint> PLI;
const double PI=acos(-1);
const int maxn = 2e5+10;
const int maxm = 1e6 + 10;
const int mod = 1e4+7;
const int INF = 0x3f3f3f3f;
using namespace std;
int nex[maxn],ex[maxn];
char t[maxn];
int n;
void getnext()
{
    int j=0,po=1,len=n;
    nex[0]=len;
    while(t[j]==t[j+1]&&j+11]=j;
    for(int i=2;iif(nex[i-po]+ielse
        {
            j=nex[po]+po-i;
            if(j<0) j=0;
            while(i+jint main()
{
   int tt;
   cin>>tt;
   while(tt--)
   {
        scanf("%d%s",&n,t);
        getnext();
        int res=0;
        for(int i=0;iprintf("%d\n",res);
   }
}

你可能感兴趣的:(kmp,字符串)