zoukankan      html  css  js  c++  java
  • jzoj3208. 【JSOI2013】编程作业(kmp)

    题面

    Description
    Will相信,很多同学都有过这样的经历:大牛已经写好了编程作业,而作为菜鸟的自己不会写怎么办呢?拿大牛的代码抄一下嘛!但是提交一模一样的作业是不是不太好?于是就改一改变量名什么的……但是其实这样的代码抄袭行为是可以被检测出来的。

    考虑到如下的两段代码,很容易发现他们其实是一样的。

    那么最开始给出的两段雷同代码就可以分别写成AiBjCiDECjDiFGC以及AaBiCaDECiDaFGC。或者简单的说,我们认为这两段代码是一样的。

    现在请写一个程序,处理若干这样的代码雷同检测问题:给一个完整代码以及一个较短的代码片段,请求出,这个代码片段在完整代码中一共出现了多少次(代码片段出现的位置可以重叠)。

    为了简单起见,我们认为程序中只会至多出现a~z这26个变量,同时也至多只有A~Z这26个非变量符号。

    题解

    所以说我讨厌字符串……

    不难看出题目的意思就是大写字母必须完全相等,小写字母可以有替换

    大写字母(KMP)就行了,考虑小写字母该怎么搞

    我们把每个小写字母的权值改成上一个这个小写字母到它的距离,那么两个小写字母相等要么它们都是在串中第一次出现,要么它们的权值相等

    于是就可以跑(KMP)

    //minamoto
    #include<bits/stdc++.h>
    #define R register
    #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
    #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
    #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    using namespace std;
    const int N=1e6+5;
    char s[N],t[N];int kmp[N],vs[N],vt[N],las[255];
    int n,m,T,res;
    bool equal(R int x,R int y,R int len){return x==y||x>=len&&y>=len;}
    void solve(){
    	scanf("%s%s",s+1,t+1),n=strlen(s+1),m=strlen(t+1);
    	memset(las,0,sizeof(las));
    	fp(i,1,n)if(s[i]>'Z')vs[i]=i-las[s[i]],las[s[i]]=i;
    	else vs[i]=-s[i];
    	memset(las,0,sizeof(las));
    	fp(i,1,m)if(t[i]>'Z')vt[i]=i-las[t[i]],las[t[i]]=i;
    	else vt[i]=-t[i];
    	kmp[0]=kmp[1]=0;
    	for(R int i=2,j=0;i<=m;++i){
    		while(j&&!equal(vt[j+1],vt[i],j+1))j=kmp[j];
    		j+=equal(vt[j+1],vt[i],j);
    		kmp[i]=j;
    	}
    	res=0;
    	for(R int i=0,j=0;i<=n;++i){
    		while(j&&!equal(vt[j+1],vs[i],j+1))j=kmp[j];
    		j+=equal(vt[j+1],vs[i],1);
    		if(j==m)++res,j=kmp[j];
    	}
    	printf("%d
    ",res);
    }
    int main(){
    //	freopen("testdata.in","r",stdin);
    	int T;scanf("%d",&T);
    	while(T--)solve();
    	return 0;
    }
    
  • 相关阅读:
    Apache虚拟主机配置(多个域名访问多个目录)(转)
    What I Learned as a Junior Developer Writing Tests for Legacy Code(转载)
    java.text包
    高性能前端框架React详解
    vue.js快速搭建图书管理平台
    vue.js用法和特性详解
    最接近原生APP体验的高性能前端框架——MUI
    用JS制作一个信息管理平台完整版
    JQuery实用技巧--学会你也是大神(1)——插件的制作技巧
    用JS制作一个信息管理平台(1)
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/10326516.html
Copyright © 2011-2022 走看看