zoukankan      html  css  js  c++  java
  • HDU 2594 Simpsons’ Hidden Talents

    KMP的应用

    看到求字符串的的前缀与后缀,首先想到next数组,但是next所求的是同一个字符串中的最大前缀后缀,本题所求的是两个字符串中的最大前缀后缀,那么我们就求出第一个字符串的next数组,在第二个字符串上跑KMP,等到第二个字符串匹配完了以后,第一个字符串匹配到哪里就是所求的答案。
    数组大小要注意

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    using namespace std;
    const int MAXN=50005;
    int init(){
    	int rv=0,fh=1;
    	char c=getchar();
    	while(c<'0'||c>'9'){
    		if(c=='-') fh=-1;
    		c=getchar();
    	}
    	while(c>='0'&&c<='9'){
    		rv=(rv<<1)+(rv<<3)+c-'0';
    		c=getchar();
    	}
    	return fh*rv;
    }
    int nxt[MAXN];
    char s1[MAXN],s2[MAXN];
    void getnxt(){
    	int len=strlen(s1);
    	nxt[0]=-1;
    	int k=-1,j=0;
    	while(j<len){
    		if(k==-1||s1[j]==s1[k]) nxt[++j]=++k;
    		else k=nxt[k];
    	}
    }
    int kmp(){
    	int len1=strlen(s1),len2=strlen(s2);
    	int i=0,j=0;
    	while(j<len2){
    		if(i==-1||s1[i]==s2[j]){
    			 i++;j++;
    		}else i=nxt[i];
    	}
    	return i;
    }
    int main(){
    	freopen("in.txt","r",stdin);
    	while(~scanf("%s %s",s1,s2)){
    		getnxt();
    		int ans=kmp();
    		if(!ans) printf("0
    ");
    		else{
    			for(int i=0;i<ans;i++) printf("%c",s1[i]);
    			printf(" %d
    ",ans);
    		}
    	}
    	fclose(stdin);
    	return 0;
    }
    
  • 相关阅读:
    11.01T3 实数二分
    11.01T2 树状数组维护动态LIS
    11.1T1打表
    10.31T4 HAOI2010最长公共子序列 计数+容斥原理
    10.31T3 其他算法思想
    10.31T2 点双联通分量+预处理前缀+二分答案
    10.31T1 二分图
    10.30T3 换根
    10.30T2 二分+前缀和(后缀和)
    10.30T1 期望DP
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/7966941.html
Copyright © 2011-2022 走看看