CSU - 1598 最长公共前缀 HDU - 2087 剪花布条

这两题其实是一样的就是在一个串中找另一个串,但是有点区别就是找到了,就要把找到了就是跳过去,就不要重复找了,与模板唯一的区别就是找到了之后要把k重新置为-1,但是c题数据比较水,你不置为-1,也能a...

 

 

给定两个字符串s和t,现有一个扫描器,从s的最左边开始向右扫描,每次扫描到一个t就把这一段删除,输出能发现t的个数。

 

Input

第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个字符串s,第二行一个字符串t,字符串长度不超过1000000。

 

Output

对于每组数据,输出答案。

 

Sample Input

2
ababab
ab
ababab
ba

Sample Output

3
2
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int maxn=1000005;
int T,n,m;
int nextt[maxn];
string s1,s2;
int len1,len2,cnt;

void getnext()
{
    nextt[0]=-1;
    int k=-1;
    for(int i=1;i-1&&s2[k+1]!=s2[i])
            k=nextt[k];
        if(s2[k+1]==s2[i])
            k=k+1;
        nextt[i]=k;
    }
}

int KMP()
{
    getnext();
//    for(int i=0;i-1&&s2[k+1]!=s1[i])
            k=nextt[k];
        if(s2[k+1]==s1[i])
            k=k+1;
        if(k==len2-1)
        {
            k=-1;
            cnt++;
        }
    }
    return cnt;
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        cnt=0;
        cin>>s1>>s2;
        len1=s1.length();
        len2=s2.length();
        printf("%d\n",KMP());
    }
    return 0;
}

 

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 

Input

输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。 

Output

输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。 

Sample Input

abcde a3
aaaaaa  aa
#

Sample Output

0
3
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int maxn=1005;
int T,n,m;
int nextt[maxn];
string s1,s2;
int len1,len2,cnt;

void getnext()
{
    nextt[0]=-1;
    int k=-1;
    for(int i=1;i-1&&s2[k+1]!=s2[i])
            k=nextt[k];
        if(s2[k+1]==s2[i])
            k=k+1;
        nextt[i]=k;
    }
}

int KMP()
{
    getnext();
//    for(int i=0;i-1&&s2[k+1]!=s1[i])
            k=nextt[k];
        if(s2[k+1]==s1[i])
            k=k+1;
        if(k==len2-1)
        {
            k=-1;
            cnt++;
        }
    }
    return cnt;
}

int main()
{
//    scanf("%d",&T);
    while(cin>>s1)
    {
        if(s1=="#")
            break;
        cin>>s2;
        cnt=0;
        len1=s1.length();
        len2=s2.length();
        printf("%d\n",KMP());
    }
    return 0;
}

 

你可能感兴趣的:(KMP)