标签:
这道题的官方题解是dp,但是可以暴力出来。改天再研究怎么dp。
暴力的时候,如果计算sum的时候,调用strlen函数会超时,可见这个函数并不是十分的好。以后能不用尽量不用。
Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 861 Accepted Submission(s): 461
#include<iostream> #include<stdio.h> #include<algorithm> #include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstring> #include<string> using namespace std; const int maxx=100005; int main(){ int t; scanf("%d",&t); while(t--){ int n,m; char s[maxx]; char p[maxx]; scanf("%d%d",&n,&m); scanf("%s",s); scanf("%s",p); int sump[maxx]; int sums[maxx]; sump[0]=sums[0]=0; for(int i=1;i<=n;i++){ sums[i]=s[i-1]-‘a‘+sums[i-1]; } for(int i=1;i<=m;i++){ sump[i]=p[i-1]-‘a‘+sump[i-1]; } int pis=sump[m]; int shave=sums[m]; for(int i=m;i<=n;i++){ shave=sums[i]-sums[i-m]; // cout<<"shave: "<<shave<<endl; if(pis==shave){ int sta=i-m; int pos=sta; int flag=1; for(int j=0;pos<i;j++){ if(s[pos]==p[j]){ pos++; }else{ if(pos+1<i&&s[pos+1]==p[j]&&s[pos]==p[j+1]){ pos+=2; j++; }else{ flag=0; break; } } } if(flag){ printf("1"); }else{ printf("0"); } }else{ printf("0"); } } for(int i=m-1;i>0;i--){ printf("0"); } printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/superxuezhazha/p/5697505.html