码迷,mamicode.com
首页 > 其他好文 > 详细

HDU-4763

时间:2018-03-05 20:46:46      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:style   main   lan   return   php   def   show   clu   target   

传送门

 

T组字符串 问每个字符串中是否能找到一个子串在原串中互不重叠地出现三次(或以上),且该子串是原串的前缀、后缀。

 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;

const int maxn = 1e6 + 10;
char s[maxn];
int f[maxn];
int len;
int T;
bool vis[maxn];

void getFail(char* P, int* f) {
    f[0] = 0; f[1] = 0;
    for (int i = 1; i < len; i++) {
        int j = f[i];
        while (j && P[i] != P[j]) j = f[j];
        f[i + 1] = P[i] == P[j] ? j + 1 : 0;
    }
}

int main() {
    scanf("%d", &T);
    while (T--) {
        scanf("%s", s);
        len = strlen(s);
        getFail(s, f);
        int t = len;
        int ans = 0;
        memset(vis, 0, sizeof(vis));
        while (t) {
            t = f[t];
            vis[t] = 1;
        }
        for (int i = len; i ; i--) {
            int t = i;
            while (t) {
                if (vis[f[t]] && t >= 2 * f[t] && len - t >= f[t]) {
                    ans = max(ans, f[t]);
                }
                t = f[t];
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

 

HDU-4763

标签:style   main   lan   return   php   def   show   clu   target   

原文地址:https://www.cnblogs.com/xFANx/p/8510900.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!