题目大意:

给定两个序列判断是否循环同构,若循环同构则输出最小表示

题解:

因为没有样例输入输出,一开始没看到要求输出最小表示

Wa一大页.

但不得不说bzoj还是挺高效的:

赞一个 XD.jpg

判断是否循环同构用kmp即可,可惜本人并不会kmp,用的AC自动机.

然后去学了一发求最小表示法方法...这。。。貌似是模板题..

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch = getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 1100010;
int ch[maxn][11],fail[maxn];
bool danger[maxn];
int nodecnt = 0;
char s[maxn<<1];
inline void insert(){
int nw = 0,len = strlen(s);
for(int i=0,c;i<len;++i){
c = s[i] - '0';
if(ch[nw][c] == 0) ch[nw][c] = ++ nodecnt;
nw = ch[nw][c];
}danger[nw] = true;
}
int q[maxn],l,r;
inline void build(){
l = 0;r = -1;fail[0] = 0;
for(int i=0;i<=9;++i){
if(ch[0][i]){
fail[ch[0][i]] = 0;
q[++r] = ch[0][i];
}
}
while(l <= r){
int u = q[l++];
for(int i=0;i<=9;++i){
int t = ch[fail[u]][i];
if(ch[u][i] == 0) ch[u][i] = t;
else{
danger[ch[u][i]] |= danger[t];
fail[ch[u][i]] = t;
q[++r] = ch[u][i];
}
}
}
}
inline bool find(){
int nw = 0,len = strlen(s);
for(int i=0;i<len;++i){
nw = ch[nw][s[i] - '0'];
if(danger[nw]) return true;
}return false;
}
inline int find2(){
int i=0,j=1,k=0,len = strlen(s);
while(i < len && j < len){
for(k = 0;s[(i+k)%len] == s[(j+k)%len] && k < len;++k);
if(k == len) return i;
if(s[(i+k)%len] > s[(j+k)%len]) i = max(i+k+1,j+1);
else j = max(j+k+1,i+1);
}
if(i < len) return i;
else return j;
}
int main(){
scanf("%s",s);insert();build();
scanf("%s",s);int n = strlen(s);
for(int i=0;i<n;++i) s[n+i] = s[i];
if(find()){
puts("Yes");
s[n] = 0;
int i = find2();
for(int j=0;j<n;++j) putchar(s[(i+j)%n]);
}else puts("No");
getchar();getchar();
return 0;
}

最新文章

  1. (1)RGB-D SLAM系列- 工具篇(硬件+关键技术)
  2. Linux 进程通信(共享内存区)
  3. python 根据对象和方法名,返回提供这个方法的定义的类
  4. Oracle系列之索引
  5. vim多标签,多窗口
  6. 解决VS2008闪退的问题
  7. POJ 3450 Corporate Identity KMP解决问题的方法
  8. leetcode第22题--Merge k Sorted Lists
  9. windows下后台运行程序
  10. Print Article hdu 3507 一道斜率优化DP 表示是基础题,但对我来说很难
  11. Flask從入門到入土(二)——請求响应與Flask扩展
  12. Odoo的模块和应用程序的区别和使用
  13. DaishaPocedureOfMine(代码)
  14. 在DevExpress程序中使用PopupContainerEdit和PopupContainer实现数据展示
  15. 洛谷 P2151 [SDOI2009]HH去散步
  16. vue 组件发布记录
  17. 自写Jquery插件 Datagrid
  18. 修改TEMPDB所在的路径
  19. Grid布局方式
  20. 表单验证插件validate

热门文章

  1. LNMP环境搭建(三:PHP)
  2. vue项目在APP禁止页面缩放
  3. android菜鸟学习笔记20----Android数据存储(四))Android数据库操作
  4. POJ 2856 Y2K Accounting Bug【简单暴力】
  5. 记一次bash脚本报错原因
  6. PHP网站在Linux服务器上面的安全配置
  7. js hoisting
  8. c的详细学习(3)数据的输入输出
  9. 【leetcode刷题笔记】Binary Tree Inorder Traversal
  10. codeforces 154A 贪心