hdu 5907 Find Q【模拟】

本文提供了一个算法解决方案,用于计算给定字符串中所有仅由字符'q'组成的连续子串的数量。通过一次遍历并利用简单的计数逻辑实现,适用于处理长度高达100,000的字符串。

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

Find Q

Accepts: 392
Submissions: 780
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 262144/131072 K (Java/Others)
问题描述
Byteasar迷恋上了'q'这个字母。

在他眼前有一个小写字母组成的字符串SSS,他想找出SSS的所有仅包含字母'q'的连续子串。但是这个字符串实在是太长了,你能写个程序帮助他吗?
输入描述
输入的第一行包含一个正整数T(1≤T≤10)T(1\leq T\leq10)T(1T10),表示测试数据的组数。

对于每组数据,包含一行一个小写字母组成字符串SSS,保证SSS的长度不超过100000100000100000
输出描述
对于每组数据,输出一行一个整数,即仅包含字母'q'的连续子串的个数。
输入样例
2
qoder
quailtyqqq
输出样例
1
7

思路;


1、直接模拟即可,注意数据范围要用long long。


Ac代码:


#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
#define ll __int64
char a[100300];
ll ans[100300];
int main()
{
    ll t;
    scanf("%I64d",&t);
    while(t--)
    {
        scanf("%s",a);
        ll cont=0;
        ll contz=0;
        ll n=strlen(a);
        for(ll i=0;i<n;i++)
        {
            if(a[i]=='q')
            {
                ll flag=0;
                for(ll j=i;j<n;j++)
                {
                    if(a[j]=='q')cont++;
                    else
                    {
                        flag=1;
                        i=j;break;
                    }
                }
                if(flag==0)break;
                ans[contz++]=cont;
                cont=0;
            }
        }
        if(cont!=0)
        {
            ans[contz++]=cont;
        }
        ll output=0;
        for(ll i=0;i<contz;i++)
        {
            output+=(ll)((ans[i]+1)*ans[i]/2);
        }
        printf("%I64d\n",output);
    }
}




### 关于割点和割边的算法练习题 #### 割点与割边的概念 在图论中,割点是指如果删除某个顶点及其关联的所有边之后,原连通图被分割成两个或更多不相连的部分,则该顶点称为割点。同样地,割边(也称桥)是指当删除某条边后,原连通图也被分割成两部分或多部分[^4]。 以下是几个经典的割点和割边相关题目集合: --- #### 经典题目集合 1. **POJ 3177 Redundant Paths** - 描述:给定一个无向图,询问至少需要添加多少条边才能使整个图变成双连通图。 - 解法提示:利用 Tarjan 算法找到所有的桥,并通过计算森林中的叶子节点数量来推导所需增加的最少边数[^5]。 2. **UVA 10189 Minesweeper (改编版本)** - 描述:在一个网格地图上模拟炸弹爆炸的影响范围,其中某些位置可能成为割点或者割边的关键路径。 - 解法提示:可以扩展为动态规划加 DFS 的形式,重点在于如何快速定位哪些区域会因为特定点/边而断开连接。 3. **Codeforces Round #XYZ Problem A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z** - 多次比赛中都出现了基于 Tarjan 算法的应用实例,比如 CF 场景下的 “Bridge Finding” 或者类似的变种问题。 4. **LeetCode Premium Problems** - 虽然 LeetCode 上免费资源较少提及显式的“割点”概念,但在一些高级付费课程里确实存在针对此类主题设计的教学案例,尤其是涉及到复杂网络拓扑结构分析时更为明显。 5. **HDU OJ Series on Graph Theory Challenges** - HDU 平台提供了大量围绕图理论展开的实际操作型习题集锦,其中包括但不限于检测简单路径上的所有潜在瓶颈——也就是我们所说的割点和桥梁。 ```python def find_bridges(graph, n): result = [] visited = [False]*n disc = [-1]*n low = [-1]*n parent = [-1]*n time = [0] def dfs(u): children = 0 visited[u] = True disc[u] = low[u] = time[0] time[0] += 1 for v in graph[u]: if not visited[v]: parent[v] = u children += 1 dfs(v) low[u] = min(low[u], low[v]) if low[v] > disc[u]: result.append((u,v)) elif v != parent[u]: low[u] = min(low[u], disc[v]) for i in range(n): if not visited[i]: dfs(i) return result ``` 上述代码片段展示了如何运用深度优先搜索技术去发现存在于任意无向图内的全部桥梁列表。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值