hdu 6863 Isomorphic Strings 哈希+求公因子
题意:
t组输入,每组数据输入一个整数n,代表字符串长度。下面再输入一个字符串
你需要判断这个字符串能不能分成大于1段,且这些段的最小表示法是一样的
例如:abccab,它可以分成2段,分别是abc和cab,它们都使用最小表示法(也就是字典序最小表示)表示之后都是abc,所以这两个串一样
题解:
因为你需要把字符串分成若干段,假设分成x段,那么x肯定满足n%x==0
这里就有两种方法,第一种就是枚举n的因子,然后再暴力去判断这个因子可不可以
另一种就是:假如存在一个可以满足题意的因子x(也就是说一段的长度为x,且每一段都相等),那么分成n/x段,每一段里面每一个字母的个数肯定要保持一样多
那么我们可以去找所有字母个数的最大公因子,设为ans,然后在1-ans里面暴力枚举就行。这样比去暴力枚举n的因子复杂度小
我们如何判断一个因子x可以不可满足题意?
对于一个串abccab,我们可以得出来a、b、c字母得个数都是2,那么它们和n的最大公因数就是2
那么长度为n的串,最多分成2段,每一段的长度n/2
然后我们开始暴力枚举[1,2)这个区间的因子,首先要判断一下n%x==0,不等于0这个因子就不行
这个枚举的是将几个n/2合并,例如1是满足n%x==0
这个时候abc为一段,cab为一段(如果x==2,那么就是将2个n/2合并成一段,即abccab为一段,因为题目要求必须将字符串分开,所以2不可以)
对于第一段abc,我们先标记一下abc的哈希值,然后再标记一下bca的哈希值,再标记cab的哈希值
然后再去判断后面的段的哈希值是否被标记过,如果标记过就没事,没标记过就证明这个因子不行
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int blo=13331;
const int maxn = 5e6+5;
ll xp[maxn],hash_1[maxn],num[maxn];
map<ll,ll>r;
void init()
{
xp[0]=1;
for(ll i=1; i<maxn; i++)
xp[i]=xp[i-1]*blo;
}
ll make_hash(char str[],ll hash_[],ll len)
{
hash_[0]=0;
for(ll i=1; i<=len; i++)
{
hash_[i]=hash_[i-1]*blo+(str[i]-'a'+1);
//cout<<hash_[i]<<" ";
}
return len;
}
char str[maxn];
int main()
{ init();
ll t;
scanf("%lld",&t);
while(t--)
{
//r.clear();
ll n,flag=1;
scanf("%lld",&n);
scanf("%s",str+1);
make_hash(str,hash_1,n);
memset(num,0,sizeof(num));
for(ll i=1;i<=n;++i)
{
num[str[i]-96]++;
}
ll ans=n;
for(ll i=1;i<=26;++i) //如果分组之后每组字符串最小表示法都一样,那么里面的每个字母的数量也一样,所以我们可以
{ //以此来下手
if(num[i])
ans=__gcd(ans,num[i]); //这个ans里面放的就是最多你能分成多少组
}
ll u=n/ans; //按照最大分成ans组,每一组的长度
if(u==1 && n!=1)
{
flag=0;
}
else
{
for(ll k=1;k<ans;++k) //枚举判断
{
ll len=k*u;
if(n%len)
{
continue;
}
r.clear();
flag=0;
ll temp=hash_1[len]-hash_1[0]*xp[len];
r[temp]=1;
for(ll i=1;i<=len;++i) //将一个字符串的各种类型字符串哈希值都算出来,并标记
{ //例如字符串abc,你不仅要算出来abc的哈希值,还要算出来bca、cab的哈希值
temp=temp*blo+(str[i]-96);
r[temp-hash_1[i]*xp[len]]=1;
}
for(ll j = 1; j * len <= n; j++) //判断后面几组是否和第一组一样
{ if(r[hash_1[j*len]-hash_1[(j - 1)*len]*xp[len]]==0)
{
flag = 1;
break;
}
}
if (flag == 0)
{ break;
}
}
}
if(!flag)
printf("Yes\n");
else printf("No\n");
}
return 0;
}
hdu 6863 Isomorphic Strings 哈希+求公因子的更多相关文章
- leetcode 205. Isomorphic Strings(哈希表)
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- [LeetCode] Isomorphic Strings
Isomorphic Strings Total Accepted: 30898 Total Submissions: 120944 Difficulty: Easy Given two string ...
- Codeforces 985 F - Isomorphic Strings
F - Isomorphic Strings 思路:字符串hash 对于每一个字母单独hash 对于一段区间,求出每个字母的hash值,然后排序,如果能匹配上,就说明在这段区间存在字母间的一一映射 代 ...
- Educational Codeforces Round 44 (Rated for Div. 2) F - Isomorphic Strings
F - Isomorphic Strings 题目大意:给你一个长度为n 由小写字母组成的字符串,有m个询问, 每个询问给你两个区间, 问你xi,yi能不能形成映射关系. 思路:这个题意好难懂啊... ...
- leetcode:Isomorphic Strings
Isomorphic Strings Given two strings s and t, determine if they are isomorphic. Two strings are isom ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
- [leetcode]205. Isomorphic Strings 同构字符串
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- CodeForces985F -- Isomorphic Strings
F. Isomorphic Strings time limit per test 3 seconds memory limit per test 256 megabytes input standa ...
- LeetCode 205. 同构字符串(Isomorphic Strings)
205. 同构字符串 205. Isomorphic Strings
随机推荐
- LeetCode278 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...
- Openstack Ocata 负载均衡安装(二)
Openstack OCATA 负载节点(二) 安装haproxy: apt install haproxy 配置haproxy: vim /etc/haproxy/haproxy.cfg globa ...
- mybatis入门教程之搭建一个简单的mybatis项目并启动它
一.准备条件: 1.依赖jar包:mybatis核心包(必须).lombok插件包(非必须)以及MySQL数据库连接驱动包(必须) <dependency> <groupId> ...
- File Inclusion - Pikachu
概述: 文件包含,是一个功能.在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件. 比如 在PHP中,提供了: include(),inclu ...
- PAT练习num3-跟奥巴马一起学编程
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝"计算机科学教育周"正式启动,奥巴马编写了很简单的计算机 ...
- linux通过ntp同步时间
1.安装服务 yum install ntp ##安装ntp服务,这个和ntpdate不一样哦,用这个比较好 systemctl start ntpd.service ###启动服务 systemct ...
- U盘制作系统启动盘方法
1.下载一个UltralSO用来把CentOS系统镜像写入U盘作为启动安装盘 U盘用一个空U盘,会格式化的. 下载下来,使用试用版就行 刻录完成.
- 给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息。
1 import java.text.SimpleDateFormat; 2 import org.apache.hadoop.fs.*; 3 4 public class E_RecursiveRe ...
- 配置MySQL主从复制报错Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work
配置MySQL主从复制报错 ``` Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave ha ...
- 有状态 无状态 stateful stateless monolithic architecture microservice architecture 单体架构
为什么游戏公司的server不愿意微服务化? - 知乎 https://www.zhihu.com/question/359630395 我大概说了,方便测试,方便维护,方便升级,服务之间松耦合,可多 ...