POJ 1509 Glass Beads---最小表示法

本文介绍了一道SAM算法入门题目,通过将字符串加倍输入到SAM中,采用贪心策略找到字符串的最小表示法。代码实现了SAM结构体,包括初始化、新增节点及添加字符等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

  T组数据,每组数据给出一个字符串,求这个字符串的最小表示发(只要求输出起始位置坐标)


  SAM入门题(检测板子是否正确)。

  将字符串S加倍丢进SAM中,然后走字符串长度次,每次贪心的沿最小的边走,然后答案就是:sam.e[po].len-len+1


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 10010
10 #define llg long long
11 #define SIZE 26 
12 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
13 llg n,m,T;
14 
15 char s[maxn];
16 
17 struct SAM
18 {
19     struct 
20     {
21         llg len,f/*parent边*/,ch[SIZE];
22         void init()
23         {
24             len=0,f=-1;
25             memset(ch,0xff,sizeof(ch));
26         }
27     }e[maxn<<1];
28     llg idx,last;
29     
30     void init() {idx=last=0; e[idx++].init();}
31     
32     int newnode() {e[idx].init(); return idx++;}
33     
34     void add(llg c)
35     {
36         int end=newnode(),tmp=last;
37         e[end].len=e[last].len+1;
38         for (;tmp!=-1 && e[tmp].ch[c]==-1;tmp=e[tmp].f){e[tmp].ch[c]=end;}//跳parent tree的边,找到第一个具有c出边的点并停下,对于没有的点连出一条边权是c的边指向当前点(end)。
39         if (tmp==-1) e[end].f=0;//如果没有任何一个点有权值为c的出边,则说明了相应字符c是第一次出现在自动机中。
40         else
41         {
42             llg nxt=e[tmp].ch[c];
43             if (e[tmp].len+1==e[nxt].len) e[end].f=nxt;//如果找到的第一个具有出边c的点的出边c左指向点的len=lastlen+1,则直接把新建点的parent边连向nxt点。
44             else
45             {
46                 llg np=newnode();
47                 e[np]=e[nxt];
48                 e[np].len=e[tmp].len+1;//新建点np
49                 e[nxt].f=e[end].f=np;
50                 for (;tmp!=-1 && e[tmp].ch[c]==nxt;tmp=e[tmp].f) {e[tmp].ch[c]=np;}//沿parent边往祖先走把所有原本连向nxt的带边权c的边改为连向np
51             }//如果不满足MAX(s)+1=MAX(s[tmp][c])则新建点
52         }
53         last=end;
54     }
55 }sam;
56 
57 int main()
58 {
59     yyj("SAM");
60     cin>>T;
61     while (T--)
62     {
63         sam.init();
64         scanf("%s",s);
65         llg len=strlen(s);
66         for (llg i=0;i<len;i++) sam.add(s[i]-'a');
67         for (llg i=0;i<len;i++) sam.add(s[i]-'a');
68         llg po=0;
69         for (llg i=0;i<len;i++)
70             for (llg j=0;j<26;j++)
71                 if (sam.e[po].ch[j]!=-1)
72                 {
73                     po=sam.e[po].ch[j];
74                     break;
75                 }
76         printf("%lld\n",sam.e[po].len-len+1);
77     }
78     return 0;
79 }

 

转载于:https://www.cnblogs.com/Dragon-Light/p/6284321.html

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值