• Luogu P1470 最长前缀 Longest Prefix


    Luogu P1470 最长前缀 Longest Prefix

    注释

    这道题与上一篇博客的题几乎一样

    解析

    • 有点麻烦的地方就是字符串的输入

    方法一:类dp

    Code

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define LL long long
    using namespace std;
    int n,m,l,rot,trie[2005][26];
    char x[80],ele[15],seq[1200005];
    bool book[2005],vis[1200005];
    void insert(char s[])
    {
    	int u=0,len=strlen(s+1);
    	for(int i=1;i<=len;i++)
    	{
    		int v=s[i]-'A';
    		if(!trie[u][v]) trie[u][v]=++rot;
    		u=trie[u][v];
    	}
    	book[u]=1;
    	return;
    }
    int find(char s[],int len)
    {
    	int u=0,maxl=0;
    	memset(vis,0,sizeof(vis));
    	for(int i=1;i<=len;i++)
    	{
    		int v=s[i]-'A';
    		if(!trie[u][v]) break;
    		u=trie[u][v];
    		if(book[u]) vis[i]=1;
    	}
    	for(int i=1;i<=len;i++)
    	{
    		if(!vis[i]) continue;
    		else maxl=i;
    		int u=0;
    		for(int j=i+1;j<=len;j++)
    		{
    			int v=s[j]-'A';
    			if(!trie[u][v]) break;
    			u=trie[u][v];
    			if(book[u]) vis[j]=1;
    		}
    	}
    	return maxl;
    }
    int main()
    {
    	while(cin>>(ele+1))
    	{
    		if(ele[1]=='.') break;
    		insert(ele);
    	}
    	while(cin>>(x+1))
    	{
    		for(int i=1;i<=strlen(x+1);i++) seq[++l]=x[i];
    	}
    	printf("%d
    ",find(seq,l));
    	return 0;
    }
    

    方法二:记忆化搜索

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define LL long long
    using namespace std;
    int n,m,l,maxl,rot,trie[2005][26];
    char x[80],ele[15],seq[1200005];
    bool book[2005],vis[1200005];
    void insert(char s[])
    {
    	int u=0,len=strlen(s+1);
    	for(int i=1;i<=len;i++)
    	{
    		int v=s[i]-'A';
    		if(!trie[u][v]) trie[u][v]=++rot;
    		u=trie[u][v];
    	}
    	book[u]=1;
    	return;
    }
    void dfs(char s[],int x,int len)
    {
    	if(vis[x]) return;
    	vis[x]=1;
    	int u=0,i=x;
    	maxl=max(maxl,i-1);
    	while(i<=len)
    	{
    		int v=s[i]-'A';
    		if(!trie[u][v]) break;
    		u=trie[u][v];
    		i++;
    		if(book[u]) dfs(s,i,len);
    	}
    	return;
    }
    int main()
    {
    	while(cin>>(ele+1))
    	{
    		if(ele[1]=='.') break;
    		insert(ele);
    	}
    	while(cin>>(x+1))
    	{
    		for(int i=1;i<=strlen(x+1);i++) seq[++l]=x[i];
    	}
    	dfs(seq,1,l);
    	printf("%d
    ",maxl);
    	return 0;
    }
    
    Classical is something not fade,but grow more precious with time pass by,so is dream.梦想这东西和经典一样,永远不会因为时间而褪色,反而更显珍贵。
  • 相关阅读:
    Ubuntu 12.04 LTS 及ubuntu14.10 -- NFS安装
    AutoFac文档4(转载)
    能粘贴Word 内容(含公式)的在线编辑器
    能粘贴Word 内容(含图片)的在线编辑器
    js+SpringBoot分片上传大文件
    js+SpringMVC分片上传大文件
    js+vue分片上传大文件
    js+csharp分片上传大文件
    js+c#.net分片上传大文件
    js+c#分片上传大文件
  • 原文地址:https://www.cnblogs.com/Hawking-llfz/p/11475130.html
Copyright © 2020-2023  润新知