zoukankan      html  css  js  c++  java
  • UVA12467 Secret Word -kmp

    题意

    给定一个字符串s,请找出一个s的最长子串,满足这个字串翻转后是s的前缀。


    思路

    • 把原串s翻转一下,得到的字符串记为t。那么问题转化为找t的一个最长子串,使得它是s的前缀。
    • 多组数据注意清零,不清零打

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn=1000003;
    char s[maxn],t[maxn];
    int len,nxt[maxn];
    void getnext(char t[])
    {
    	int i=0,j=-1,lent=strlen(t); nxt[0]=-1;
    	while(i<lent)
    	{
    		if(j==-1||t[i]==t[j]) nxt[++i]=++j;
    		else j=nxt[j];
    	}
    }
    int kmp(char s[],char t[])
    {
    	int i=0,j=0,ans=0,lens=strlen(s),lent=strlen(t);
    	while(i<lens)
    	{
    		if(j==-1||s[i]==t[j]) ++i,++j;
    		else j=nxt[j];
    		ans=max(ans,j);
    		if(j==lent) j=nxt[j];
    	}
    	return ans;
    }
    int main()
    {
    	int T;scanf("%d",&T);
    	while(T--)
    	{
    		scanf("%s",s); len=strlen(s);
    		for(int i=0;i<len;++i) t[i]=s[i];
    		t[len]='';
    		reverse(t,t+len);
    		getnext(s);
    		for(int i=kmp(t,s)-1;i>=0;--i) cout<<s[i];
    		puts("");
    	}
    	return 0;
    }
    
  • 相关阅读:
    CDE 快捷键
    shell 快捷键
    Monitor 问题
    vim 编辑快捷键
    MySQL 的include lib文件夹找不到怎么
    深入分析C++引用
    vim 查找匹配字符串次数
    如何配置Vim背景色以及字体?
    vim中字体和配色方案设置
    C#设置richtextbox滚动到最后一行
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/14263010.html
Copyright © 2011-2022 走看看