SSL-ZYC 2575 给出字符串

题目大意:
给出一个由小写字母组成的字符串。你的任务是找出其最长的出现至少两次的子串的长度。


思路:
纯模拟。
这道题我用的是O(n^4)的方法。前两个循环分别枚举两个子串的起始位置,第三个循环枚举这两个字串的长度,最后一个循环用来比较两个子串是否相同。加上一点优化,AC!


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

char a[201],b[201],c[201];
int n,maxn;

int main()
{
    scanf("%s",&a); 
    n=strlen(a);
    for (int i=0;i<=n-2;i++)
    {
        for (int j=i+1;j<=n-1;j++)  //枚举子串开始位置
        {
            for (int k=1;k<=n-1;k++)  //字串长度
            {
                int ok=1;
                memset(b,0,sizeof(b));
                memset(c,0,sizeof(c));
                for (int q=1;q<=k;q++) b[q]=a[q+i-1];
                for (int q=1;q<=k;q++) 
                {
                    c[q]=a[q+j-1];
                    if (c[q]!=b[q])  //如果与另一个字串不相同
                    {
                        ok=0;
                        break;  //退出
                    }
                }
                if (ok==1&&k>maxn) maxn=k;
                else if (ok==0) break;
            }
        }
    }
    printf("%d\n",maxn);
    return 0;
}
posted @ 2018-03-10 15:26  全OI最菜  阅读(71)  评论(0编辑  收藏  举报