zoukankan      html  css  js  c++  java
  • luogu P2462 [SDOI2007]游戏

    LINK:SDOI2007游戏

    题意:接龙前一个要比后面大1 且后一个单词出现的各自字母的次数>=前一个单词各自的字母的次数

    考虑暴力dp sort之后dpY 显然会T.

    考虑我们没必要枚举j 我们知道后面的要找到前面的一个决策可以通过删掉一个字母来实现 由于删掉最多26个字母我们暴力枚举26种情况。

    字符串hash快速查找即可。建议开map查 多一个小log...

    窝是看标签有虚树才写这道题的 结果和虚树没什么关系。。

    至于怎么hash 对每个len进行hash这样的话不容易冲突 hash随便想一个法则hash就行了 求稳的话就双hash吧。开链表hash也行

    写着有点烦了 逻辑很混乱 说好不采用通常字符串hash的 虽然没用但是复杂度更高 考试的时候还是建议前后缀hash 然后逐位判断 顺便上双hash + 链表防止冲突。

    我随便写了一个hash方法。。map开的也是醉了。。

    当然要注意的一点是 输入问题 字符串不知道有多少行的输入 可以~scanf 来这样写好像是没读到会返回-1 但是普通时候好像会返回0 总之记住即可,字符串的时候要这样写。

    const int MAXN=10010;
    int n,ans,pos;
    int pre[MAXN];
    struct wy
    {
    	int len,id;
    	int c[26];
    }t[MAXN];
    char a[MAXN][110];
    inline int cmp(wy a,wy b){return a.len<b.len;}
    map<int,pii>H[110];
    inline void get_path(int x)
    {
    	if(!x)return;
    	get_path(pre[x]);
    	printf("%s
    ",a[t[x].id]+1);
    }
    int main()
    {
    	freopen("1.in","r",stdin);
    	while(~scanf("%s",a[++n]+1))
    	{
    		t[n].len=strlen(a[n]+1);t[n].id=n;
    		rep(1,t[n].len,j)++t[n].c[a[n][j]-'a'];
    	}
    	--n;
    	sort(t+1,t+1+n,cmp);
    	rep(1,n,i)
    	{
    		ll ha=0,mx=0,ha1=0;
    		rep(0,25,j)
    		{
    			ha1=(ha1*P+(j+1)*t[i].c[j])%mod;
    			if(!t[i].c[j])continue;
    			--t[i].c[j];ha=0;
    			rep(0,25,k)ha=(ha*P+(k+1)*t[i].c[k])%mod;
    			if(H[t[i].len-1].find(ha)!=H[t[i].len-1].end())
    			{
    				pii w=H[t[i].len-1][ha];
    				if(w.F>mx)mx=w.F,pre[i]=w.S;
    			}
    			++t[i].c[j];
    		}
    		++mx;H[t[i].len][ha1]=mk(mx,i);
    		if(mx>ans)ans=mx,pos=i;
    	}
    	put(ans);
    	get_path(pos);
    	return 0;
    }
    
  • 相关阅读:
    python 模块之-time
    asp.net web 通过IHttpAsyncHandler接口进行消息推送
    模拟登陆
    Socket发送文件
    asp.net 在自己指定的文件夹下面弄个App.config来读取配置
    C#多线程数据分布加载
    socket收发消息
    .net分布在指定文件夹的web.confgi或者app.config
    linux 修改oracle字符集
    文件读取草稿(excel,csv)
  • 原文地址:https://www.cnblogs.com/chdy/p/12487467.html
Copyright © 2011-2022 走看看