hdu 5510 KMP+暴力

来源:互联网 发布:服务器坏了 raid 数据 编辑:程序博客网 时间:2024/06/05 01:09

Bazinga

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 6175    Accepted Submission(s): 1905


Problem Description
Ladies and gentlemen, please sit up straight.
Don't tilt your head. I'm serious.

For n given strings S1,S2,,Sn, labelled from 1 to n, you should find the largest i (1in) such that there exists an integer j (1j<i) and Sj is not a substring of Si.

A substring of a string Si is another string that occurs in Si. For example, ``ruiz" is a substring of ``ruizhang", and ``rzhang" is not a substring of ``ruizhang".
 

Input
The first line contains an integer t (1t50) which is the number of test cases.
For each test case, the first line is the positive integer n (1n500) and in the following n lines list are the strings S1,S2,,Sn.
All strings are given in lower-case letters and strings are no longer than 2000 letters.
 

Output
For each test case, output the largest label you get. If it does not exist, output 1.
 

Sample Input
45ababczabcabcdzabcd4youlovinyouaboutlovinyouallaboutlovinyou5dedefabcdabcdeabcdef3abaccc
 

Sample Output
Case #1: 4Case #2: -1Case #3: 4

Case #4: 3

题目描述: 给你一串字符串 让你判断第几个字符串满足它前面有至少一个字符串不是它的子字符串

思路:对字符串的处理KMP很好想到 然后直接暴力会超时 所以要进行一些优化 可以在读入的时候就进行比较 如果前面是后面的子字符串

就进行标记 最后再求没有标记的

#include<iostream>#include<cstdio>#include<cstring>using namespace std;struct S{    char str[2005];};int f[2005];//后缀数组void getfill(char s[])//计算后缀数组{    memset(f, 0, sizeof(f));    int len = strlen(s);    for(int i = 1;i < len;i++)    {        int j = f[i];        while(j&&s[i] != s[j])            j = f[j];        f[i+1] = (s[i] == s[j])?j+1:0;    }}//判断s是否为a的子串int fin(char a[], char s[]){    getfill(s);    int j = 0;    int lena = strlen(a);    int lens = strlen(s);    for(int i = 0;i < lena;i++)    {        while(j&&a[i]!=s[j])            j = f[j];        if(a[i]==s[j])            j++;        if(j == lens)            return 1;    }    return 0;}int main(){    int t;    scanf("%d",&t);    S r[505];    int v[2005];    int m = 0;    while(t--){        int n;        memset(v,1,sizeof(v));        m++;        scanf("%d",&n);        for(int i = 0; i < n; i++)        {            scanf("%s",r[i].str);        }        for(int i = 1; i < n;i++)            if(fin(r[i].str,r[i-1].str))            v[i-1] = 0;        int i,j;        bool flag = false;            for(i = n-1 ;i>=0&&!flag;i--)            for(j=0;j<i&&!flag;j++)                {                if(v[j])  //优化时间                if(!fin(r[i].str,r[j].str))                {                    printf("Case #%d: %d\n",m,i+1);                    flag = true ;                }            }        if(!flag)            printf("Case #%d: -1\n",m);    }    return 0;}


原创粉丝点击