count the string(next数组理解)

emmm…求前缀后缀公共子串出现了几次也就是求next数组不为0出现 了几次再加上自己的串长。(之前用了几个strlen获取串承长TLE了几次猛然发现题目给了串长…我好菜啊Orz)

根据题意求自己前缀匹配次数,由next数组是前缀后缀最长公共子串可知sum【i】表示在i位置之前能找到最大的匹配次数。


    // ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//这是个能AC的假代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include
#define N 10000+5
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;

int nex[1000005];
char s1[1000005], s2[1000005];
int sum[200005];
int m;
void getnex()
{
	//int len2 = strlen(s2);
	//memset(nex, -1, sizeof(nex));
	nex[0] = { -1 };
	int k = -1;
	int j = 0;
	while (j < m )
	{
		if (k == -1 || s2[k] == s2[j])
		{
			j++;
			k++;
			nex[j] = k;
		}
		else
		{
			k=nex[k];
		}

	}
}

int main()
{
	int T;
	scanf("%d", &T);
	
	while (T--)
	{
		scanf("%d%s",&m, s2);
		memset(sum, 0, sizeof(sum));
		//strcpy(s2, s1);
		//s2[m] = 'z';
		getnex();
		int res = 0;
		for (int i = 1; i <=m; i++)
		{
			sum[nex[i]]++; 
			
		}
		for (int i = 1; i <=m; i++)
		{
			res += sum[i];
			res %= 10007;
		}
		res += m;
		printf("%d\n", res % 10007);
		

	}
	return 0;
}



正解


    // ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include
#define N 10000+5
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;

int nex[1000005];
char s1[1000005], s2[1000005];
int sum[200005];
int m;
void getnex()
{
	//int len2 = strlen(s2);
	//memset(nex, -1, sizeof(nex));
	nex[0] = { -1 };
	int k = -1;
	int j = 0;
	while (j < m )
	{
		if (k == -1 || s2[k] == s2[j])
		{
			j++;
			k++;
			nex[j] = k;
		}
		else
		{
			k=nex[k];
		}

	}
}

int main()
{
	int T;
	scanf("%d", &T);

	while (T--)
	{
		scanf("%d%s",&m, s2);
		memset(sum, 0, sizeof(sum));
		//strcpy(s2, s1);
		//s2[m] = 'z';
		getnex();
		int res = 0;

		for (int i = 1; i <=m; i++)
		{
			sum[i]=sum[nex[i]]+1;
			res =(res+sum[i])%10007;
		}

		printf("%d\n", res);


	}
	return 0;
}




你可能感兴趣的:(KMP)