[JZOJ5178]【NOIP2017提高组模拟6.28】So many prefix?

Description
 
Input
Output
 
Sample Input
样例一:
abababc

样例二:
isdashagayisdashagaydashisnotagaydashisnotagay
Sample Output
样例一:
6

样例二:
30
 
Data Constraint

 

 


 

 

 

设f[i]表示设 f[i] 代表以 i 前缀 ‘s[1]s[2]…s[i]’ 内所有偶数子串出现的次数(包含本身)。

f[i] = f[nxt[i]], i%2==1

f[i] = 1 + f[nxt[i]] , i%2==0

 


 

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define reg register
#define ll long long
char a[200005];
int nxt[200005], f[200005];
ll ans;

signed main()
{
    cin >> a + 1;
    int n = strlen(a + 1);
    int k = 0;
    nxt[1] = 0;    
    for(register int i = 2 ; i <= n ; i ++)
    {
        while(k != 0 and a[i] != a[k+1]) k = nxt[k];
        if(a[i] == a[k+1]) k++;
        nxt[i] = k;
    }
    for (reg int i = 1 ; i <= n ; i ++)
        if (i % 2 == 1) f[i] += f[nxt[i]], ans += f[i];
        else f[i] += 1 + f[nxt[i]], ans += f[i];
    cout<<ans<<endl;
    return 0;
    
}

 

转载于:https://www.cnblogs.com/BriMon/p/9463997.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值