易彰彪最近有点奇怪,一向爱打游戏他最近居然盯着一张全是大小写字母的表在看,好像在找什么东西。他说,这是他女神给他的一张表,他需要回答女神的问题——在忽略大小写(即大写字母和小写字母视为同一字母)的情况下,是否能在表中找到某一连续的字符串(第iii 行的尾部和第 i+1i + 1i+1 行的头部视为相连)。但是英语不好的易彰彪一看到字母就头晕,聪明的你能帮他解决这个问题吗?
输入格式:
输入有多组测试数据。
每组第一行会输入两个整数 nnn 和 mmm,分别是表的行数和列数,1≤n,m≤301 \leq n, m \leq 301≤n,m≤30。
第 222 行到第 n+1n + 1n+1 行,每行输入一个长度为 mmm 的字符串,表示表的内容。
第 n+2n + 2n+2 行输入易彰彪想要在表中找到的字符串。
输出格式:
如果按照题目描述能够在表中找到目标字符串,输出YES
, 否则输出NO
。
样例1
输入:
5 5 yiZha nGBia oaerg htyfj awert yizhangbiao
输出:
YES
因为n,m的范围比较小,所以就暴力串与串之间的配对了:
#include<stdio.h> #include<string.h> char a[33]; char b[10000]; char c[100]; int main() { int n,m,l; int i,j; while(scanf("%d %d",&n,&m)!=-1) { int p=0; for(i=0; i<n; i++) { scanf("%s",&a); for(int j=0; j<m; j++) { if(a[j]>='A'&&a[j]<='Z') { b[p++]=a[j]+32; } else { b[p++]=a[j];//把所有字符用一个数组存放 } } } scanf("%s",c); l=strlen(c); for(i=0;i<l;i++) { if(c[i]>='A'&&c[i]<='Z')//把大写全部变成小写,便于比较 { c[i]=c[i]+32; } else { c[i]=c[i]; } } int i = 0, j = 0; while (j < l&& i < p) //自左向右逐个比对字符 { if (b[i] == c[j]) //若匹配 { i++; //则转到下一字符 j++; } else //文本串回退,模式串复位 { i -= (j-1); j = 0; } } if (i-j < p-l+1) //i - j < p - l + 1时匹配;否则失配 { printf("YES\n"); } else { printf("NO\n"); } } }