8.字符串
字符串
开题顺序: \(HADBEMK\)
\(A\) luogu P3501 [POI2010]ANT-Antisymmetry
- 多倍经验: SP15569 Antisymmetry
- 题解
\(B\) luogu P4555 [国家集训队]最长双回文串
\(C\) luogu P6114 【模板】Lyndon 分解
\(D\) BZOJ2176 Strange string
-
最小表示法板子。
-
因为字符值域 \(\in [33,254]\) ,所以需要
unsigned char
代替char
。点击查看代码
unsigned char s[20000010]; int main() { int n,i,l,r,len; cin>>n; for(i=1;i<=n;i++) { cin>>s[i]; s[n+i]=s[i]; } l=1; r=2; while(l<=n&&r<=n) { len=0; while(len<=n-1&&s[l+len]==s[r+len]) { len++; } if(len==n) { break; } else { if(s[l+len]>s[r+len]) { l+=len+1; l+=(l==r); } else { r+=len+1; r+=(l==r); } } } for(i=min(l,r);i<=n;i++) { cout<<s[i]; } for(i=1;i<=min(l,r)-1;i++) { cout<<s[i]; } return 0; }
\(E\) CF471D MUH and Cube Walls
\(F\) CF494B Obsessive String
\(G\) CF432D Prefixes and Suffixes
-
第一问显然是 LibreOJ 10036. 「一本通 2.1 练习 2」Seek the Name, Seek the Fame ,直接反着跳 \(next\) 即可。
-
设 \(f_{i}\) 设 \([1,i]\) 在原串中的出现次数,则有 \(\begin{cases} f_{i} \gets f_{i}+1 \\ f_{nxt_{i}} \gets f_{nxt_{i}}+f_{i} \end{cases}\) ,初始时 \(f_{1 \sim n}=0\) 。
点击查看代码
int nxt[100010],f[100010]; char s[100010]; vector<int>ans; int main() { // #define Issac #ifdef Issac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,i,j; scanf("%s",s+1); n=strlen(s+1); for(i=2,nxt[1]=j=0;i<=n;i++) { while(j>=1&&s[i]!=s[j+1]) { j=nxt[j]; } j+=(s[i]==s[j+1]); nxt[i]=j; } for(i=n;i>=1;i--) { f[i]+=1; f[nxt[i]]+=f[i]; } for(i=n;i>=1;i=nxt[i]) { ans.push_back(i); } reverse(ans.begin(),ans.end()); cout<<ans.size()<<endl; for(i=0;i<ans.size();i++) { cout<<ans[i]<<" "<<f[ans[i]]<<endl; } return 0; }
\(H\) luogu P2375 [NOI2014] 动物园
\(I\) CF965E Short Code
\(J\) CF1616H Keep XOR Low
\(K\) CF558E A Simple Task
\(L\) luogu P9717 [EC Final 2022] Binary String
\(M\) luogu P3311 [SDOI2014] 数数
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18521907,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。