zoukankan      html  css  js  c++  java
  • 【ybtoj】【kmp】字符串题

    推荐一篇dalao的博客:wind_whisper qwq特别有帮助

    题解

    题解

    神题!!!能够大大加深对KMP的理解qwq

    循环节的常用结论:nxt[i] = i - pre[i] (画画图就能推出来)

    对于每一个 nxt[i] 分类讨论:

    p[i]>0:

    此时 s[i] = s[p[i]]

    p[i]=0:

    我们首先要明白p[i]=0是怎么得到的
    因为kmp计算里的那个while语句始终成立,也就是s[i+1]!=s[j+1],导致j一直跳失配跳到了0
    所以当前这一位只要和往前跳的那些不同就可以了
    注意如果这个i不是第一位的话,它也应该是与第1位不同的(因为while循环里不会讨论到第一位的情况),同时第一位随便填,所以默认填 ‘a’字符

    代码

    字符串题
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int INF = 0x3f3f3f3f,N = 1e5+10;
    int n,nxt[N],pre[N];
    bool vis[30];
    char s[N];
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)	
    	{
    		scanf("%d",&pre[i]);
    		nxt[i]=i-pre[i];
    		if(nxt[i]) s[i]=s[nxt[i]]; 
    		else 
    		{
    			int now=nxt[i-1];
    			memset(vis,0,sizeof(vis));	
    			while(now)
    			{
    				vis[s[now+1]-'a']=1;
    				now=nxt[now];
    			}
    			if(i!=1) vis[0]=1; 
    			for(int j=0;j<26;j++)	
    				if(!vis[j]) {s[i]='a'+j;break;}
    		}
    	}
    	printf("%s",s+1);
    	return 0;
    }
    
  • 相关阅读:
    win安装Theano
    Photoshop
    Sublime Text与LaTeX的结合
    Python开源库的bug
    Pillow库的学习和使用
    对OpenSSL心脏出血漏洞的试验
    Scrapy的学习和使用
    FreeImage库的学习和使用
    gdal库的学习和使用
    VirtualBox安装Debian
  • 原文地址:https://www.cnblogs.com/conprour/p/15234755.html
Copyright © 2011-2022 走看看