1 4 abab
题意:给定一个字符串,求所有前缀的出现次数。
解题思路:首先求这个字符串的next数组,假如next值不为0,就代表与前面有匹配,累加,然后加上一个n,取模就得到了答案,
研究了好久,请教了好几个人才搞明白,太弱了。
代码:
/* ***********************************************
Author :xianxingwuguan
Created Time :2014-2-1 22:45:04
File Name :2.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int maxn=200100;
const double pi =acos(-1.0);
const double eps =1e-8;
const int mod=10007;
char str[maxn];
int next[maxn],dp[maxn];
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int T,i,j,k,m,n;
cin>>T;
while(T--)
{
cin>>n;
scanf("%s",str);
j=0,k=-1;
next[0]=-1;
while(j<n)
{
if(k==-1||str[j]==str[k])
next[++j]=++k;
else k=next[k];
}
for(i=0;i<=n;i++)cout<<next[i]<<" ";cout<<endl;
for(i=0;i<n;i++)dp[i]=1;
int cnt=0;
for(i=1;i<=n;i++)if(next[i])cnt++;
cnt=(cnt+n)%mod;
cout<<cnt<<endl;
}
return 0;
}
原文:http://blog.csdn.net/xianxingwuguan1/article/details/18891685