1941 Scary Martian Word
http://acm.timus.ru/problem.aspx?space=1&num=1941
題意:
一個火星文字母是由三個ASCII(從33到122)值一樣的字符組成輸入n個火星文,中間用空格隔開,
第二行再輸入m個火星文,用空格隔開,求m中有多少個連續子串的火星字母組成和n中一樣(包括種類和個數);
eg:
輸入:
aaa bbb????????????????????????????????????????????????????????? //輸入字符串a
aaa aaa bbb ccc aaa zzz aaa bbb ccc????? //輸入字符串b
輸出:
3
Hint:
Two substrings “aaa bbb ccc” (starting from the second and the seventh positions in the text) and a substring “bbb ccc aaa” are scary for the Martians.
思路:
本題主要是輸入的時候出了問題,因為是連續三個字符相同,則只存一個,剛開始用的gets(),結果在輸入
第二個字符串的時候盡管前面用了getchar()但還是被吃掉了一個字符,雖然我以為這并不影響存儲,但結果
是wa,后改成了一個個字符輸入,把有用的字符不重復存起來;用d1[101]把標記a中的各個字符的個數,
然后再搜索b ,先使b的子串和a的長度相同,用d2[101]標出此時子串中各字母的個數再與d1比較,
若個數和種類都相同,則為符合題意的一個子串,再將這個長度的子串沿b往后移一位,此時只有一個字母移
出和一個字母移入,然后分析這兩個字母給d2[101]帶的變化,計算出來后與d1比較,依此循環……
#include<stdio.h>
#include<string.h>
char c,a[40009],b[4000009];
int d1[101]={0};
int d2[101]={0};
int main()
{
?int i,k=0,s=0,lena,lenb,f=0;
??? for(i=1;scanf("%c",&c);i++)
??? {
???? if(c=='\n')break;
???? if(i%4==1)a[k++]=c;
??? }
??? a[k]='\0';
??
?????? lena=k;
??? k=0;
??? for(i=1;scanf("%c",&c);i++)
??? {
???? if(c=='\n')break;
???? if(i%4==1)b[k++]=c;
??? }
??? b[k]='\0';
??? lenb=k;
???? for(i=0;i<lena;i++)
????? d1[a[i]-'!']++;
?if(lenb<lena)printf("0\n");
?else
?{?
??for(i=0;i<lena;i++)
???d2[b[i]-'!']++;
??for(i=0;i<100;i++)
???if(d1[i]==d2[i])f++;
???if(f==100)s++;
???for(i=1;i<=lenb-lena;i++)
???{
????if(d2[b[i-1]-'!']==d1[b[i-1]-'!'])f--;
????else
????if(d2[b[i-1]-'!']==d1[b[i-1]-'!']+1)f++;
????d2[b[i-1]-'!']--;
????d2[b[i+lena-1]-'!']++;
????if(d2[b[i+lena-1]-'!']==d1[b[i+lena-1]-'!'])f++;
????else
????if(d2[b[i+lena-1]-'!']==d1[b[i+lena-1]-'!']+1)f--;
????if(f==100)s++;
???}
???printf("%d\n",s);
?}
?return 0;
}
?
?
?
?
?
總結
以上是生活随笔為你收集整理的1941 Scary Martian Word的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 寻宝游戏
- 下一篇: Pytest + Allure 测试报告