记录编号 |
327744 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2011]统计单词数 |
最终得分 |
100 |
用户昵称 |
Hzoi_chairman |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.384 s |
提交时间 |
2016-10-22 20:54:53 |
内存使用 |
0.28 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int read()
{
int x,f=1;
char ch;
while(ch=getchar(),!isdigit(ch))if(ch=='-')f=-1;
x=ch-48;
while(ch=getchar(),isdigit(ch))x=x*10+ch-48;
return x*f;
}
void write(int x)
{
if(x<0)putchar('-'),x=-x;
int cnt=0;char ch[50];
while(ch[++cnt]=x%10+48,x/=10);
while(putchar(ch[cnt]),--cnt);
putchar(' ');
}
#define maxn 1000100
string s1,s2;
int f[20];
int main()
{
freopen("stat.in","r",stdin);
freopen("stat.out","w",stdout);
cin>>s1;getline(cin,s2);
getline(cin,s2);
int n=s1.length(),m=s2.length();
if(s1[0]>90)s1[0]-=32;//注意判断一下0
for(int i=1;i<n;i++)
{
if(s1[i]>90)s1[i]-=32;
int j=f[i];
while(j&&s1[i]!=s1[j])j=f[j];
if(s1[i]==s1[j])f[i+1]=j+1;
else f[i+1]=0;
}
int cnt=0,beginpos=-1;
for(int k=0;k<m;k++)
{
if(s2[k]!=' '&&k!=0)continue;//注意需要整个单词都匹配
int i,pos;
if(s2[k]==' ')pos=i=k+1;
else pos=i=k;
int j=0;
for(;s2[i]!=' '&&i<m;i++)
{
if(s2[i]>90)s2[i]-=32;
while(j&&s1[j]!=s2[i])j=f[j];
if(s1[j]==s2[i])j++;//cout<<i<<' '<<j<<' '<<pos<<' '<<k<<' '<<s2[i]<<' '<<s1[j]<<endl;
if(j==n)
{
if(s2[i+1]==' ')
{
cnt++;
if(beginpos==-1)beginpos=i-n+1;
}
break;
}if(i-pos!=j-1)break;
}
}
if(cnt)write(cnt),write(beginpos);
else puts("-1");
// system("pause");
}