ST--CSUSTOJ-1026(KMP+简单思维)

题目链接https://csustacm.fun/problem/1026

Description

给出2个字符串S和T,问字符串T中有多少个子串t满足以下条件:

①S是t的前缀

②S是t的后缀

Input

输入占2行。(输入为多组输入)

第一行输入字符串S

第二行输入字符串T

|T| <5*10^5

|S| <5*10^5

Output

输出占一行,输出子串的个数

Sample Input 1 

a
aa

Sample Output 1

3

刚开始看的时候有点蒙。。但他是AC人数第二多的题目。。。。还是可以写写的

我们假设这个T为S****S****S******S***

那么我们的选择有多少种?很简单,只需要选两个S就好了,保证不重复的话就是小学的数线段题目了(1+n)*n/2就是答案了,那么在这之前我们只需要求一下T中S的个数就好了,由于数据比较大,所以只能KMP跑一遍。

以下是AC代码:

#include 
using namespace std;

const int mac=5e5+10;

char s[mac],t[mac];
int f[mac];

void getfail()
{
    int m=strlen(s);
    f[0]=0,f[1]=0;
    for (int i=1; i

 

你可能感兴趣的:(#,csust2017区域个人,字符串的处理)