两文件之间的字符串匹配

#include 
#include 
#include 
#include 
using namespace std;

const int N = 1e5 + 10, M = 1e6 + 10;

char buffs[N], buffp[N], p[N], s[M];
int n, m;
int ne[N];

void delete_char(char *str, char target)
{
    int i, j;
    for (i = 0, j = 0; str[i] != '\0'; ++ i)
    {
        if (str[i] != target)    str[j ++] = str[i];
    }
    str[j] = '\0';
}

bool KMP(char *s, char *p)
{
    ne[0] = -1;
    for (int i = 1, j = -1; i < n; ++ i)
    {
        while (j != -1 && p[i] != p[j + 1])    j = ne[j];
        if (p[i] == p[j + 1])    j ++;
        ne[i] = j;
    }
    
    for (int i = 0, j = -1; i < m; ++ i)
    {
        while (j != -1 && s[i] != p[j + 1])    j = ne[j];
        if (s[i] == p[j + 1])    j ++;
        if (j == n - 1)
        {
            return true;
//            cout << i - j << " ";
//            j = ne[j];
        }
    }
    return false;
}

int main()
{
    cout << "核查结果如下:" << endl;
    
    FILE *fp;
    
    // 读取模式串s 
    if ((fp = fopen("E://全体名单.txt", "r")) == NULL)
    {
        printf("文件打开错误\n");
        exit(0);
    }
    
    while (!feof(fp))
    {
        fgets(buffs, sizeof(buffs), fp);
        strcat(s, buffs);
    }
    
    m = strlen(s);
    delete_char(s, '\n');
//    printf("%s\n", s);
    
    // 读取模板串p 
    if ((fp = fopen("E://登记名单.txt", "r")) == NULL)
    {
        printf("文件打开错误\n");
        exit(0);
    }
    
    while (!feof(fp))
    {
        fgets(buffp, sizeof(buffp), fp);
        delete_char(buffp, '\n');
//        printf("%s\n", buffp);
        n = strlen(buffp);
        if (KMP(s, buffp))
            cout << buffp << " " << "已接种" << endl;
        else
            cout << buffp << " " << "未接种" << endl;
    }
        
    return 0;
}

 

 

posted @ 2021-07-15 19:07  青衫客36  阅读(89)  评论(0编辑  收藏  举报