HDU 5284

wyh2000 and a string problem

http://acm.hdu.edu.cn/showproblem.php?pid=5284

Accepts: 428

Submissions: 1313

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 131072/65536 K (Java/Others)

问题描述

青年理论计算机科学家wyh2000在教小学生一些基础的字符串概念。
定义一个字符串s的子序列为将s中一些元素删掉得到的字符串。可以删掉全部元素,可以不删,也可以只删一些。
他还教了小学生如何判断一个串是不是另一个串的子序列。比如给你一个串,要求判断wyh是不是它的子序列,那么你只需要找一个w,找一个y,再找一个h,使得w在y前面,y在h前面即可。
有一天小学生拿着一个串问他“wyh是不是这个串的子序列?”
但是wyh2000有重度近视眼,如果字符串中有一段连续的v(至少两个),那么他会把它看成一个w。例如,字符串vvv会被看成w,字符串vvwvvv会被看成www,字符串vwvv会被看成vww。
请问wyh2000会怎么回答这个问题?

输入描述

第一行为数据组数T(1≤T≤105)。
接下来T行,每行一个字符串,表示小学生拿来问wyh2000的串。
总串长不超过3145728。只包含小写字母。
hack数据字符串长度不超过100000。

输出描述

对于每组数据,如果wyh2000会把wyh看成该串的子串,那么输出一行Yes,否则输出一行No。

输入样例

4
woshiyangli
woyeshiyangli
vvuuyeh
vuvuyeh

输出样例

No
Yes
YesNo



 1 #include <stdio.h>
 2 #include <string.h>
 3 char s[3145728],s1[3145728];
 4 int main()
 5 {
 6     int T,len,count1,k1,l1,l2,i,k;
 7     scanf("%d",&T);
 8     while(T--)
 9     {
10         scanf("%s",s);
11         len=strlen(s);
12         count1=0;
13         k1=0;
14         for(int i=0; i<len; i++)
15         {
16             if(s[i]==‘v‘)
17             {
18                 count1++;
19             }
20             else
21             {
22                 if(count1>=2)
23                 {
24                     s1[k1++]=‘w‘;
25                 }
26                 else if(count1==1)
27                 {
28                     s1[k1++]=‘v‘;
29                 }
30                 count1=0;
31                 s1[k1++]=s[i];
32             }
33         }
34         if(count1>=2)
35         {
36             s1[k1++]=‘w‘;
37         }
38         else if(count1==1)
39         {
40             s1[k1++]=‘v‘;
41         }
42         l1=-1;
43         for(int i=0; i<k1; i++)
44         {
45             if(s1[i]==‘w‘)
46             {
47                 l1=i;
48                 break;
49             }
50         }
51         l2=-1;
52         if(l1>=0&&l1<=k1-3)
53         {
54             for(i=l1+1; i<k1; i++)
55             {
56                 if(s1[i]==‘h‘)
57                 {
58                     l2=i;
59                 }
60             }
61             if(l2!=-1)
62             {
63                 for(i=l1+1; i<=l2-1; i++)
64                 {
65                     if(s1[k]==‘y‘)
66                     {
67                         printf("Yes\n");
68                         break;
69                     }
70                 }
71                 if(i==l2)
72                 {
73                     printf("No\n");
74                 }
75             }
76             else
77             {
78                 printf("No\n");
79             }
80         }
81         else
82         {
83             printf("No\n");
84         }
85
86     }
87     return 0;
88 }
时间: 2024-11-05 17:28:02

HDU 5284的相关文章

HDU 5284 wyh2000 and a string problem(字符串,水)

题意:比如给你一个串,要求判断wyh是不是它的子序列,那么你只需要找一个w,找一个y,再找一个h,使得w在y前面,y在h前面即可.有一天小学生拿着一个串问他“wyh是不是这个串的子序列?”.但是wyh2000有重度近视眼,如果字符串中有一段连续的v(至少两个),那么他会把它看成一个w.例如,字符串vvv会被看成w,字符串vvwvvv会被看成www,字符串vwvv会被看成vww.请问wyh2000会怎么回答这个问题?输出yes和no. 思路:其实就是将两个以上的v换成w,再来看是否能有'wyh'子

hdu 5284 wyh2000 and a string problem(没有算法,只考思维,字符数组得开20万,不然太小了)

代码: #include<cstdio> #include<cstring> using namespace std; char s[200000]; int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",s); int w=0,y=0,h=0; int len=strlen(s); for(int i=0; i<len; i++) { if(w==0&&

HDU 5284 wyh2000 and a string problem(错误总结)

---恢复内容开始--- 题目链接:戳我(英文),戳我(中文) 题目大意: 看中文 样例解释: 略 解题思路: for循环跑一遍,遇到 vv 就变成 w 就行了 错误的代码 int k = 0, i; for(i = 0; str[i+1]; i++) { printf("%d %c\n", i, str[i]); if(str[i] == 'v' && str[i+1] == 'v') { i = i + 1; //这里不能加1 str[i] = 'w'; //k++

[Water]Hdu 5284 wyh2000 and a string problem

#include <cstdio> #include <cstring> using namespace std; const int MAXN=10000000+5; char a[MAXN]; int t; char b[3]={'w','y','h'}; int main() { scanf("%d",&t); getchar(); while(t--){ gets(a); for(int i=0;a[i+1];++i)if(a[i]=='v'&a

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

HDU 3555 Bomb (数位DP)

数位dp,主要用来解决统计满足某类特殊关系或有某些特点的区间内的数的个数,它是按位来进行计数统计的,可以保存子状态,速度较快.数位dp做多了后,套路基本上都差不多,关键把要保存的状态给抽象出来,保存下来. 简介: 顾名思义,所谓的数位DP就是按照数字的个,十,百,千--位数进行的DP.数位DP的题目有着非常明显的性质: 询问[l,r]的区间内,有多少的数字满足某个性质 做法根据前缀和的思想,求出[0,l-1]和[0,r]中满足性质的数的个数,然后相减即可. 算法核心: 关于数位DP,貌似写法还是