1. 程式人生 > >SDUT 2463 學密碼學一定得學程式

SDUT 2463 學密碼學一定得學程式

暴力列舉:
#include <bits/stdc++.h>
using namespace std;

char str1[1000002], str2[10002];
void Find(char str1[], char str2[]);

int main()
{

    int n;
    scanf("%d", &n);
    while(n --)
    {
        scanf("%s", str1);
        scanf("%s", str2);
        Find(str1, str2);
    }
    return 0;
}
void Find(char str1[], char str2[])
{
    int i = 0, j = 0;
    while(str1[i+j]!='\0'&&str2[j]!='\0')
    {
        if(str1[i+j]==str2[j])
        {
            j++;
        }
        else
        {
            i++;
            j = 0;
        }
    }
    if(str2[j]=='\0')
        printf("%d\n", i+1);
    else printf("::>_<::\n");
}

 
KMP:
#include <bits/stdc++.h>
using namespace std;

int next[1000010];
char str1[1000010], str2[10010];
void creat_next(char *str);
int Find(char *str1, char *str2);

int main()
{
    int n;
    cin >> n;
    while(n --)
    {
        scanf("%s", str1);
        scanf("%s", str2);
        creat_next(str1);
        if(Find(str1, str2))
        {
            cout << Find(str1, str2) << endl;
        }
        else
        {
            cout << "::>_<::" << endl;
        }
    }
    return 0;
}

void creat_next(char *str)
{
    int lenth = strlen(str);
    int j = -1, k = 0;
    next[0] = -1;
   while(k < lenth)
    {
        if(j == -1||str[j] == str[k])
        {
            ++j;
            ++k;
            next[k] = j;
        }
        else
        {
            j = next[j];
        }
    }
}

int Find(char *str1, char *str2)
{
    int lenth1 = strlen(str1), lenth2 = strlen(str2);
    int i = 0, j = 0;
    while(i < lenth1 && j < lenth2)
    {
        if(j == -1 || str1[i] == str2[j])
        {
            ++i;
            ++j;
        }
        else
        {
            j = next[j];
        }
    }
    if(j == lenth2) return i-lenth2+1;
    return 0;
}