【xsy1018】 小A的字母游戏 扩展CRT
题目大意:有$n$个无限长的循环字符串,所谓循环字符串,就是由某一个子串重复叠加而成。现在想知道最早在哪一位,这n个字符串的那一位的字母相同。
数据范围:$n≤30000$,答案$<2^{63}$。
不难发现,此题你只要对每个字母求一个最早都出现的位置,然后取一个$min$就可以了。
对于每个字母取一个最早大家都出现过的位置,这个显然用扩展中国剩余定理去求就可以了。
注意此题中串长的lcm可能会爆long long 要用__int128
#include<bits/stdc++.h>
#define MM 30005
#define L __int128
using namespace std; int id[MM][]={},len[MM]={};
int n;
int vis[]={}; void exgcd(L a,L b,L &x,L &y){
if(b==){x=; y=; return;}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
L inv(L x,L MOD){
L a=,b=;
exgcd(x,MOD,a,b);
return a;
}
L __lcm(L m1,L m2){return m1*m2/__gcd(m1,m2);}
void excrt(L &c1,L &m1,L c2,L m2){
L gcd=__gcd(m1,m2),lcm=__lcm(m1,m2);
if((c2-c1)%gcd) {m1=; return;}
L x=(inv(m1/gcd,m2/gcd)*((c2-c1)/gcd)%lcm*m1%lcm+c1+lcm)%lcm;
c1=x; m1=lcm;
} int main(){
scanf("%d",&n);
for(int x=;x<=n;x++){
memset(vis,,sizeof(vis));
char c[]; scanf("%s",c+);
len[x]=strlen(c+);
for(int i=;i<=len[x];i++) vis[c[i]]=i; for(int i='A';i<='Z';i++) id[x][i-'A']=vis[i];
for(int i='a';i<='z';i++) id[x][i-'a'+]=vis[i];
}
L ans=1e18;// ans=ans*ans;
L INF=ans;
for(int x=;x<;x++){
int ok=;
for(int i=;i<=n;i++) if(id[i][x]==) {ok=; break;}
if(ok==) continue;
L c=id[][x],m=len[];
for(int i=;i<=n;i++){
L C=id[i][x],M=len[i];
excrt(c,m,C,M);
if(m==) break;
}
if(m==) continue;
if(c==) c=m;
ans=min(ans,c);
}
if(ans==INF) cout<<-<<endl;
else{
long long out=ans;
cout<<out<<endl;
}
}
【xsy1018】 小A的字母游戏 扩展CRT的更多相关文章
- 扩展CRT +扩展LUCAS
再次感谢zyf2000超强的讲解. 扩展CRT其实就是爆推式子,然后一路合并,只是最后一个式子上我有点小疑惑,但整体还算好理解. #include<iostream> #include&l ...
- GUI线程 :打字母游戏
代码: /** * */ package com.niit.syntronized; import java.awt.Color; import java.awt.FlowLayout; import ...
- 扩展crt
题解: 很久之前写过一篇..但好像写的不太正常 就重新写一篇 对于质数有一种朴素的crt合并 但其实那个没啥用..那个能做的扩展crt都能做 并且那个好像不能动态加方程组 所以就会扩展crt就行了 扩 ...
- 微信小程序开发的游戏《拼图游戏》
微信小程序开发的游戏<拼图游戏> 代码直接考进去就能用 pintu.js // pintu.js Page({ /** * 页面的初始数据 */ data: { }, initGame: ...
- BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set
题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...
- JSP简单练习-猜字母游戏
<!-- guessCharExample.jsp --> <%@ page contentType="text/html; charset=gb2312" %& ...
- 猜字母游戏(Java)
我的代码: package day20181025; import java.util.Arrays; import java.util.Scanner; /** * 猜字母 * @author Ad ...
- 差分数组|小a的轰炸游戏-牛客317E
小a的轰炸游戏 题目链接:https://ac.nowcoder.com/acm/contest/317/E 思路 这题考查的是对差分数组原理和前缀和的理解. 四个数组分别记录朝着四个方向下放的个数 ...
- 扩展中国剩余定理(扩展CRT)详解
今天在$xsy$上翻题翻到了一道扩展CRT的题,就顺便重温了下(扩展CRT模板也在里面) 中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$. 正常的$CRT$ ...
随机推荐
- win7 一切软件都安装不上 解决 把他卸掉
KB2962872 控制面板,添加删除程序,查看已更新
- 20155206 2016-2017-2 《Java程序设计》第9周学习总结
20155206 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...
- PyCharm2017破解版安装
PyCharm2017破解版安装步骤: 1.右击软件压缩包选择解压到pycharm2017. 2.在解压文件夹里面找到pycharm-professional-171.3780.47,右击打开. 3. ...
- 【Unity】2.2 Unity编辑器中的常用菜单项
分类:Unity.C#.VS2015 创建日期:2016-03-26 Unity 5.3.4编辑器共提供了7个主菜单项,这一节主要学习其中的常用项. 一.File 1.基本功能 New Scene:新 ...
- =delete(c++11)
1.为什么要阻止类对象的拷贝? 1)有些类,不需要拷贝和赋值运算符,如:IO类,以避免多个拷贝对象写入或读取相同的IO缓冲 2.如何阻止? 1)不定义拷贝构造函数和拷贝赋值运算符时,好心的编译器也会及 ...
- 为UITextView添加通知..来检测UITextView内容的改变
self.mTextView =[[UITextView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH - 100, 28)]; se ...
- (动态规划 最长有序子序列)Monkey and Banana --HDU --1069
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1069 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- MFC 的SetWindowPos 用法
转自于:http://hi.baidu.com/max_new/blog/item/e2bbe607b1f127c57b8947c0.html 许多软件,特别是占桌面面积不是很大的软件,通常都提供了一 ...
- CentOS 7 x64部署tomcat
1.jdk1.7 官网地址:jdk下载地址 下载地址:jdk下载地址 2.tomcat 没啥可说,wget 去下载 3.开放端口 firewall-cmd --zone=/tcp --permane ...
- date(): It is not safe to rely on the system’s timezone settings.
在执行php脚本时出现的错误: date(): It is not safe to rely on the system’s timezone settings.You are *required* ...