字符串模拟赛T1

// source code from laekov for c0x17
#define PRID "bxjl"
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long dint;

const int maxn = 100003;
const int mod = 998244353;

char a[maxn];
int n, m, ne[maxn], sz[maxn];

void preNext() {
    ne[1] = 0;
    for (int i = 2, j = 0; i <= n; ++ i) {
        for (; j && a[i] != a[j + 1]; j = ne[j]);
        if (a[i] == a[j + 1] && j + 1 < i) {
            ne[i] = ++ j;
        } else {
            ne[i] = 0;
        }
    }
    memset(sz, 0, sizeof(sz));
    for (int i = n; i; -- i) {
        ++ sz[i];
        sz[ne[i]] += sz[i];
    }
}

int main(int argc, char* args[]) {
    if (argc < 2 || strcmp(args[1], "-nf")) {
        freopen(PRID ".in", "r", stdin);
        freopen(PRID ".out", "w", stdout);
    }
    scanf("%s", a + 1);
    n = strlen(a + 1);
    preNext();
    dint ans(0);
    for (int i = 1; i <= n; ++ i) {
        ans += sz[i];
    }
    printf("%d\n", (int)(ans % mod));
}

 

posted @ 2016-07-20 19:22  ACforever  阅读(139)  评论(0编辑  收藏  举报