#10045. 「一本通 2.2 练习 1」Radio Transmission

本文介绍了一种通过计算字符串的最短循环节来确定其最短重复单元的方法,并提供了一个具体的C++实现示例。

给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。

输入格式

第一行给出字符串的长度 L,第二行给出一个字符串,全由小写字母组成。

输出格式

输出最短的长度。

样例

样例输入 1

8
cabcabca

样例输出 1

3

样例说明

对于样例,我们可以利用 abc 不断自我连接得到 abcabcabc,读入的 cabcabca 是它的子串。

数据范围与提示

对于全部数据,1≤L≤10^6。

解析:
求出字符串的最短循环节的长度;
令最短循环节为s1,字符串结尾残缺的一段循环节为s2,要使s2变成循环节,需要加上s3;
s1=s2+s3;
对于给出的字符串,可以转化成s1,s1…s1,s2的形式,将s1拆分成s2+s3,则字符串变为
s2,s3,s2,s3…s2;的形式,我们可以看出s的最长公共前缀后缀在这里插入图片描述

观察发现当 ss 扔掉后缀(suffix)后,剩下 s2s2 和 s3s3,放在一起就是 s1s1,也就是我们要求的循环节。

综上,最短循环节长度为 l−next(l)l−next⁡(l)。
思路来自:https://www.cnblogs.com/juruo-zzt/

代码:

<think>我们面对的问题是如何在HTML中使标签(label)与单选按钮(radio button)完全水平对齐。这常涉及到CSS样式的调整,因为默认情况下,它们可能不会完美对齐。 常见的解决方案包括: 1. 使用`vertical-align`属性调整垂直对齐。 2. 将标签和单选按钮包裹在容器中,并使用Flexbox布局。 3. 使用网格布局(Grid)。 4. 调整标签的`display`属性并设置`line-height`等。 下面我将介绍几种常用的方法。 ### 方法1:使用`vertical-align`属性 对于行内元素或`inline-block`元素,可以使用`vertical-align`属性来调整垂直对齐。例如: ```html <style> input[type="radio"] { vertical-align: middle; } label { vertical-align: middle; } </style> <input type="radio" id="option1" name="options"> <label for="option1">选项1</label> ``` 这种方法简单,但可能在不同浏览器或字体大小下效果不一致。 ### 方法2:使用Flexbox布局 将标签和单选按钮放在一个容器中,然后使用Flexbox布局,可以轻松实现水平对齐。 ```html <style> .radio-container { display: flex; align-items: center; /* 垂直居中 */ } </style> <div class="radio-container"> <input type="radio" id="option2" name="options"> <label for="option2">选项2</label> </div> ``` 这种方法更现代,也更容易控制。 ### 方法3:使用网格布局 类似地,使用CSS Grid也可以实现: ```html <style> .radio-container { display: grid; grid-template-columns: auto 1fr; align-items: center; } </style> <div class="radio-container"> <input type="radio" id="option3" name="options"> <label for="option3">选项3</label> </div> ``` ### 方法4:调整标签为块级元素并设置定位 如果不想改变布局方式,也可以将标签设置为块级元素,然后过调整位置来实现对齐,但这种方法相对复杂。 ### 示例代码 下面是一个使用Flexbox的完整示例: ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>标签与单选按钮对齐</title> <style> .radio-group { display: flex; flex-direction: column; /* 垂直排列,如果要水平排列多个选项,可以改为row */ gap: 8px; /* 选项之间的间距 */ } .radio-option { display: flex; align-items: center; } </style> </head> <body> <form> <div class="radio-group"> <div class="radio-option"> <input type="radio" id="male" name="gender"> <label for="male">男</label> </div> <div class="radio-option"> <input type="radio" id="female" name="gender"> <label for="female">女</label> </div> </div> </form> </body> </html> ``` 在这个例子中,每个单选按钮和标签都被包裹在一个`div.radio-option`中,该div使用Flexbox布局,并且子元素垂直居中。 ### 注意事项 - 不同浏览器的默认样式可能不同,可以使用CSS重置(reset)来统一基础样式。 - 如果使用图标字体或其他自定义元素,可能需要微调。 - 确保为每个`<input>`设置`id`,并且`<label>`的`for`属性与之匹配,这样点击标签时也能选中单选按钮。 过以上方法,我们可以实现标签和单选按钮的水平对齐。 §§相关问题§§ 1. 如何垂直居中多个单选按钮组? 2. 如何调整单选按钮和标签之间的间距? 3. 如何自定义单选按钮的样式? 4. 在响应式布局中如何调整单选按钮组?</think>在HTML中使标签与单选按钮完全水平对齐,可以过CSS调整元素的垂直对齐方式来实现。以下是几种常用方法及示例代码: ### 方法1:使用`vertical-align`属性(推荐) ```html <style> .radio-group label, .radio-group input { vertical-align: middle; /* 关键属性 */ } </style> <div class="radio-group"> <input type="radio" id="option1" name="options"> <label for="option1">选项1</label> <input type="radio" id="option2" name="options"> <label for="option2">选项2</label> </div> ``` ### 方法2:使用Flexbox布局 ```html <style> .radio-group { display: flex; align-items: center; /* 垂直居中 */ } .radio-item { display: flex; align-items: center; margin-right: 15px; } </style> <div class="radio-group"> <div class="radio-item"> <input type="radio" id="option3" name="options"> <label for="option3">选项3</label> </div> <div class="radio-item"> <input type="radio" id="option4" name="options"> <label for="option4">选项4</label> </div> </div> ``` ### 方法3:使用表格布局(传统方法) ```html <table cellspacing="0"> <tr> <td><input type="radio" id="option5" name="options"></td> <td><label for="option5">选项5</label></td> </tr> <tr> <td><input type="radio" id="option6" name="options"></td> <td><label for="option6">选项6</label></td> </tr> </table> ``` ### 关键原理说明 1. **对齐问题根源**:标签和输入框默认是行内元素(inline),但它们的基线(baseline)对齐方式不同 2. **核心属性**: - `vertical-align: middle`:强制元素在行内垂直居中 - `display: flex + align-items: center`:现代布局解决方案 3. **注意事项**: - 所有方法都需确保`<label>`的`for`属性与`<input>`的`id`匹配 - 设置`margin/padding`时需对称,避免产生新的偏移 - 移动端建议使用Flexbox方案 ### 效果对比 | 方法 | 兼容性 | 响应式 | 推荐指数 | |------|--------|--------|----------| | vertical-align | IE8+ | 一般 | ★★★★☆ | | Flexbox | IE10+ | 优秀 | ★★★★★ | | 表格布局 | 所有浏览器 | 差 | ★★☆☆☆ | > 提示:对于复杂表单,建议结合CSS重置消除浏览器默认样式差异: > ```css > input, label { margin: 0; padding: 2px; } > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值