【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$ ...
随机推荐
- 20155210 2016-2017-2 《Java程序设计》第7周学习总结
20155210 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量: GMT(Greenwich Mean Time)时间:现在不是标准时间 世界时 ...
- 2018.09.14 codeforces364D(随机化算法)
传送门 根据国家集训队2014论文集中胡泽聪的随机化算法可以通过这道题. 对于每个数,它有12" role="presentation" style="posi ...
- 2018.07.08 POJ 2481 Cows(线段树)
Cows Time Limit: 3000MS Memory Limit: 65536K Description Farmer John's cows have discovered that the ...
- hdu-1069(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 题意:一群猴子,给出n块砖的长x宽y高z,用这些砖拼起的高度最高是多少, 要求底下的砖的长宽都要 ...
- 【Unity】1.1 安装Unity 5.3.4 开发环境
分类:Unity.C#.VS2015 创建日期:2016-03-23 一.简介 Unity分个人版(Personal)和专业版(Pro).个人版是免费的(部分高级功能受限,但初学者也用不到它),Pro ...
- x11vnc配置--ubuntu14.04
x11vnc是连接到真实的X会话,相比vnc4server和tightvncserver自己创建不同分辨率的xserver来说,画面延时和显示效果应该要好一些.两种服务都试过,个人感觉x11vnc要好 ...
- (最短路 spfa)Wormholes -- poj -- 3259
http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- no_namespace rename 在C++中是什么意思啊
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("E ...
- POJ1511来回最短路
POJ1511 问你从1到其它点得所有最短路之和 与 其他点到1得所有最短路之和 得总和 思路很明确就是两次最短路,翻转一次地图就好了 一开始就是两次spfa之间处理好数据得更新管理就好 vect ...
- tf中softmax_cross_entropy_with_logits与sparse_softmax_cross_entropy_with_logits
其实这两个都是计算交叉熵,只是输入数据不同. #sparse 稀疏的.稀少的 word_labels = tf.constant([2,0]) predict_logits = tf.constant ...